1

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

设置时 GetDC 会设置一次 hdc,但它可能没问题;上面这个我每秒都在空闲循环中运行 100 次,也从 OnPain 消息中运行;这不是很好,只是因为 TextOut 结果只是闪烁,其余的都可以 - 有人可以告诉我一些建议如何消除这种闪烁并获得稳定的 TextOut 结果吗?很多tnx

4

2 回答 2

3

您需要“双缓冲”以避免闪烁。

在它的位图中创建内存 DCCreateCompatibleDC选择,CreateCompatibleBitmap并在此内存 DC 中创建并绘制适当的大小。

当您的图片准备就绪时 -BitBlt它在您的窗口 DC 上。

于 2012-11-17T19:27:46.877 回答
1

这是很自然的。你在 DC 上画了一个 DIB。并且立即绘制一个文本,该文本(可能)放置,使其边界矩形与StretchDIBits.

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

为了避免闪烁,您应该使用所谓的双缓冲。这表示:

  1. 创建足够大小的位图。
  2. 创建一个 DC(所谓的内存 DC)
  3. 选择这个位图进去。
  4. 在这个 DC 上画出你的 DIB(不是你最初获得的那个)。
  5. 画出你的文字。
  6. 最后用于BitBlt将图像从位图传输到您的初始 DC。
  7. 不要忘记清理东西:DeleteObject对于 DIB,DeleteDC对于内存 DC。

或者,您可以保留您的位图,而不是在每次需要绘制某些东西时创建它。从性能的角度来看它更好:做StretchXXXX起来很重,加上从位图在屏幕上绘制比绘制DIB快得多(假设视频卡支持2D加速)。

于 2012-11-17T19:33:34.383 回答