结合blits和gdi绘图(不起作用,blins)

combining blits and gdi drawings (do not work, blinks)

本文关键字:不起作用 blins 绘图 blits gdi 结合      更新时间:2023-10-16

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

您需要"双缓冲区"来避免闪烁。

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

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

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

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

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

  1. 创建一个足够大小的位图
  2. 创建DC(所谓的内存DC)
  3. 将此位图选择到其中
  4. 在这个DC上绘制你的DIB(不是你最初获得的)
  5. 绘制文本
  6. 最后使用BitBlt将图像从位图传输到初始DC
  7. 不要忘记清理东西:DIB的DeleteObject,内存DC的DeleteDC

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