GDI+双缓冲:后备缓冲区双色单色化

4

我正在尝试使用C++、Windows API和GDI+构建一个非常简单的图形应用程序。在第一次尝试构建应用程序时,出现了严重的闪烁问题,因此这段代码尝试使用双缓冲,但失败了。

当尝试使用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);

你确定 LoadBitmapRes 成功了吗? - 500 - Internal Server Error
是的 - 如果有任何错误,它会返回 NULL,但它并没有,它可以单缓冲工作。 - user10F64D4
嗯,我没有看到任何明显的错误,但我会检查每个API函数调用的结果。 - 500 - Internal Server Error
更新:显然一切都是用单色黑白绘制的。 - user10F64D4
1个回答

5

使用CreateCompatibleDC创建内存设备上下文时,其显示表面的宽度和高度恰好为一个单色像素。因此,在该内存设备上下文中调用CreateCompatibleBitmap将创建一个单色位图。

由于选择进入内存设备上下文的位图控制颜色特性,您必须确保它与最终用于显示内存设备上下文内容的设备上下文匹配。为此,应向CreateCompatibleBitmap传递目标设备上下文。

修正后的代码:

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

@user 与你的问题无关,我会将这段代码放在 WM_SIZE 处理程序中。如果你有一个固定大小的窗口,当窗口被创建时仍然会收到 WM_SIZE 消息。如果它是可调整大小的,你的代码已经准备好了,你只需要更新 BitBlt 调用中的宽度/高度参数即可。 - IInspectable

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接