我正在尝试将纹理blit与gdi绘图结合在一起 (通过
void draw()
{
StretchDIBits(hdc, 0, 0, CLIENT_X, CLIENT_Y, 0, 0, BUF_X, BUF_Y, buffer, &bmi, DIB_RGB_COLORS, SRCCOPY);
TextOut(hdc, 10, 10, "Hello World", 11);
}
hdc在设置时被GetDC取消一次,但它可能没问题;以上我在空闲循环中每秒运行100次,也从OnPain消息运行;只是因为TextOut结果只是闪烁,其余的都没问题 - 有人能告诉我一些建议如何消除这种眨眼并获得稳定的TextOut结果吗? tnx
答案 0 :(得分:3)
你需要"双缓冲"避免眨眼。
创建内存DC CreateCompatibleDC
在其中选择使用CreateCompatibleBitmap
创建的适当大小的位图并在此内存中绘制DC。
当你的照片准备好了 - BitBlt
它在你的窗口DC上。
答案 1 :(得分:1)
这很自然。你在DC上画一个DIB。然后立即绘制一个(大概)放置的文本,使其边界矩形与StretchDIBits
中使用的边界重叠。
简单来说:你画了一些东西,然后在同一个地方画了别的东西。这会闪烁。您还期待什么?
为了避免眨眼,你应该使用所谓的双缓冲。这意味着:
BitBlt
将图像从位图传输到初始DC。DeleteObject
,内存DC为DeleteDC
。您可以选择保留位图,而不是每次需要绘制内容时创建位图。从性能的角度来看,它更好:做StretchXXXX
很重,而且从位图在屏幕上绘图比绘制DIB要快得多(假设视频卡支持2D加速)。