GDI +双缓冲:后缓冲双色单色

时间:2013-08-12 23:30:47

标签: c++ windows winapi doublebuffered

我正在尝试使用C ++,windows api和GDI +构建一个非常简单的图形应用程序。当第一次尝试构建应用程序时,引入了大量闪烁,因此此代码尝试使用双缓冲,但失败了。 hdcBuf是后备缓冲区。

当尝试使用GDI + Graphics :: DrawCachedBitmap向后备缓冲区绘制内容时,位图以黑白双色绘制。

LoadBitmapRes从EXE资源创建CachedBitmap;此功能适用于单缓冲。

代码有什么问题吗?提前谢谢!

全局:

CachedBitmap* fish;
HDC hdc;
HDC hdcBuf;
HBITMAP hbmpBuf;
Graphics* gfxBuf;

WM_CREATE:

hdc = GetDC(hwnd);
hdcBuf = CreateCompatibleDC(hdc);
hbmpBuf = CreateCompatibleBitmap(hdcBuf, 640, 480);
SelectObject(hdcBuf, hbmpBuf);
gfxBuf = Graphics::FromHDC(hdcBuf); 
fish = LoadBitmapRes(gfxBuf, MAKEINTRESOURCE(FISH2), "SPRITE");

WM_PAINT:

HDC temp = BeginPaint(hwnd, &ps);
gfxBuf->DrawCachedBitmap(fish, x, y);
BitBlt(temp, 0, 0, 640, 480, hdcBuf, 0, 0, SRCCOPY);
EndPaint(hwnd, &ps);

1 个答案:

答案 0 :(得分:4)

使用CreateCompatibleDC创建内存DC时,其显示表面正好是一个单色像素宽和一个单色像素高。因此,在此内存DC上调用CreateCompatibleBitmap时,会创建单色位图。

由于选择到存储器DC中的位图控制颜色特性,因此必须确保它与最终用于显示存储器DC内容的DC相匹配。为此,您应将目的地DC传递给CreateCompatibleBitmap

更正后的代码:

hdc = GetDC(hwnd);
hdcBuf = CreateCompatibleDC(hdc);
hbmpBuf = CreateCompatibleBitmap(hdc, 640, 480); // uses source DC
SelectObject(hdcBuf, hbmpBuf);
相关问题