Win32双缓冲绘制黑色背景

3

我正在使用C++在Win32环境下进行项目开发,尝试实现双缓冲绘图,但是屏幕上只显示黑色背景,并且正确的位图也无法显示。这也导致我的WM_MOUSEMOVE事件无法将位图随光标移动而绘制。下面是paint()函数的代码:paint()被调用于wndproc下的WM_PAINT事件中,scroll是滚动条的位置,目前还没有使用。

int paint(HWND hWnd, HINSTANCE hInst, RECT clientRect, std::vector<Measure> *measures, int scroll)
{
int x = 90;
hdc = BeginPaint(hWnd, &ps);
hdcmem = CreateCompatibleDC(hdc);
HBITMAP hbmScreen = CreateCompatibleBitmap(hdc, clientRect.right, clientRect.bottom);
SelectObject(hdcmem,hbmScreen); 
/*these functions just create the bitmaps into hdcmem*/
drawStaff(hWnd, hInst, clientRect, x, 0);
drawKey(hWnd, hInst, clientRect, x, (*measures)[0], 0);
drawTime(hWnd, hInst, clientRect, x, (*measures)[0], 0);
drawNotes(hWnd, hInst, clientRect, measures, x);
    BitBlt(hdc, 0, 0, clientRect.right, clientRect.bottom, hdcmem, 0, 0, SRCCOPY);
ReleaseDC(hWnd, hdcmem);
return 0;
}

3
每次绘制时无需重新制作后备缓冲区,只需在 WM_CREATE(和 WM_SIZE)时制作一次,并使用 SetWindowLongPtr(GWLP_USERDATA) 将其附加到 HWND 上。 - Necrolis
3
您有资源泄漏 - 您忘记在从此函数返回之前调用hdcmem的DeleteObject函数。 - selbie
3
你还未调用EndPaint。 - selbie
1个回答

3

在绘制其他图形之前,你需要先用背景颜色来填充位图。如果我没记错的话,创建位图时默认情况下会用黑色进行填充。


在选择对象到hdcmem之后,我尝试添加以下代码: SetBkColor(hdcmem, COLORREF RGB(0, 0, 0)); 我相信这是白色的,但我也尝试了用255代替0,以及其他各种数字,但都没有改变我得到的图像。这是否是您所说的更改位图背景,还是与更改位图控件的背景不同? - Aaron K
7
您需要使用FillRect命令来填充您想要的颜色。SetBkColor可以设置文本的背景颜色,但是您似乎没有绘制任何文本,所以此命令将不会起作用。 - Raymond Chen
2
@AaronK - RGB(0,0,0) 是纯黑色,不是白色! - selbie

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