结合blits和gdi图纸(不工作,闪烁)

时间:2012-11-17 18:30:09

标签: c++ windows winapi gdi

我正在尝试将纹理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

2 个答案:

答案 0 :(得分:3)

你需要"双缓冲"避免眨眼。

创建内存DC CreateCompatibleDC在其中选择使用CreateCompatibleBitmap创建的适当大小的位图并在此内存中绘制DC。

当你的照片准备好了 - BitBlt它在你的窗口DC上。

答案 1 :(得分:1)

这很自然。你在DC上画一个DIB。然后立即绘制一个(大概)放置的文本,使其边界矩形与StretchDIBits中使用的边界重叠。

简单来说:你画了一些东西,然后在同一个地方画了别的东西。这会闪烁。您还期待什么?

为了避免眨眼,你应该使用所谓的双缓冲。这意味着:

  1. 创建足够大小的位图。
  2. 创建DC(所谓的内存DC)
  3. 将此位图选入其中。
  4. 在此DC(不是您最初获得的DC)上绘制DIB。
  5. 绘制文字。
  6. 最后使用BitBlt将图像从位图传输到初始DC。
  7. 不要忘记清理事物:DIB为DeleteObject,内存DC为DeleteDC
  8. 您可以选择保留位图,而不是每次需要绘制内容时创建位图。从性能的角度来看,它更好:做StretchXXXX很重,而且从位图在屏幕上绘图比绘制DIB要快得多(假设视频卡支持2D加速)。