4

我已经设法用 GDI 实现双缓冲,但不能用 GDI+。我想显示一个 png 图像而不让它闪烁。此外,在某些时候,我还想使用 GDI+ 用 png 图像实现动画,因此了解如何使用 GDI+ 进行双缓冲是必要的。

我已经设法通过 ISTREAM 将 png 图像转换为 Image 对象:这是我的代码的一部分,可以帮助您了解我遇到问题的地方:

memmove(pBlock,pImage, size);
CreateStreamOnHGlobal(hBlock, FALSE, &pStream);
Graphics graphics(memDC);
Image image(pStream);
int image_width;
int image_height;
image_width= image.GetWidth();
image_height=image.GetHeight();
graphics.DrawImage(&image, posX,posY, image_width, image_height);
BitBlt(hdc, 0, 0, image_width, image_height, memDC, 0, 0, SRCCOPY);

注意:如果我将 png 图像直接绘制到屏幕 DC (hdc) 上,它会渲染得很好。但是,当我尝试先将图像绘制到 memDC,然后将该 memDC 映射到 screenDC 时,没有图像出现!

有人可以指出我如何使用 GDI plus 进行双重缓冲的正确方向吗?谢谢

4

1 回答 1

2

我认为您的问题可能在于您如何创建 memDC - 您是否使用 CreateCompatibleDC() 来创建它以确保它与您正在执行 BitBlt() 的 hdc 兼容?

我之前回答过一个与此类似的关于双缓冲的问题,您可能会发现该答案很有帮助:

Windows 7 中的 GDI 加速/绘制到内存位图

那里有很多代码,我用 GDI 将缓冲区加倍,但使用 GDI 或 GDI+ 绘制到内存位图。我发现能够使用 GDI 非常有用,因为它对于某些操作(尤其是与位图相关的功能)比 GDI+ 快得多,但是 GDI+ 做一些事情要容易得多,因此它可以两全其美。

于 2013-03-12T08:10:45.810 回答