我在互联网上读过很多例子,但我仍然被困住了。我正在尝试处理发送到我的应用程序的WM_PAINT消息。
在我的应用程序中,我总是绘制相同的 DC,名为 g_hDC
。它工作得很好。收到WM_PAINT
后,我只是尝试将g_hDC
的内容绘制到BeginPaint
返回的DC中。我想g_hDC
包含我绘制的最后一个位图。所以我只想恢复它。
case WM_PAINT:
PAINTSTRUCT ps;
int ret;
HDC compatDC;
HDC currentDC;
HDC paintDC;
HBITMAP compatBitmap;
HGDIOBJ oldBitmap;
paintDC = BeginPaint(g_hWnd, &ps);
currentDC = GetDC(g_hWnd);
compatDC = CreateCompatibleDC(paintDC);
compatBitmap=CreateCompatibleBitmap(paintDC, CONFIG_WINDOW_WIDTH, CONFIG_WINDOW_HEIGHT);
oldBitmap=SelectObject(compatDC, compatBitmap);
ret = BitBlt(compatDC,
ps.rcPaint.left,
ps.rcPaint.top,
ps.rcPaint.right - ps.rcPaint.left,
ps.rcPaint.bottom - ps.rcPaint.top,
currentDC,
ps.rcPaint.left,
ps.rcPaint.top,
SRCCOPY);
ret = BitBlt(paintDC,
ps.rcPaint.left,
ps.rcPaint.top,
ps.rcPaint.right - ps.rcPaint.left,
ps.rcPaint.bottom - ps.rcPaint.top,
compatDC,
ps.rcPaint.left,
ps.rcPaint.top,
SRCCOPY);
DeleteObject(SelectObject(compatDC, oldBitmap));
DeleteDC(compatDC);
DeleteDC(currentDC);
EndPaint(g_hWnd, &ps);
破;
但它只是画了一个白色矩形...我尝试了很多可能性,但没有任何效果。你能帮帮我吗?
你做错了很多事情。
首先,您的保存g_hDC
依赖于实现细节:您注意到指针是相同的,因此保存指针。由于与GDI优化相关的各种原因(例如,有DC缓存(,这可能在短期内有效,但最终会在最不方便的时候停止工作。或者,当您没有 DC 时,您可能会想使用 DC 指针,并且会在其他内容上涂鸦(或者由于 GDI 对象线程相关性而无法这样做(。
访问窗口WM_PAINT
之外的 DC 的正确方法是调用 GetDC(hwnd)
。
CreateCompatibleDC()
创建与hdc
兼容的内存中 DC。画到compatDC
不足以画到hdc
;绘制到compatDC
后,您需要绘制回hdc
。对于您的情况,您需要进行两次BitBlt()
电话;第二个将从compatDC
闪回hdc
.有关详细信息,请参阅此示例代码。
位图选择到 DC 中时,不能DeleteObject()
位图。您的SelectObject(compatDC, oldBitmap)
电话需要在DeleteObject(compatBitmap)
之前进行。(这就是i486在他的答案中试图得到的。
(我确信这个答案在某些地方具有误导性或不完整;如果是,请告诉我。
使用它删除位垫:DeleteObject( SelectObject(compatDC,oldBitmap) );
- 上一行没有删除位图。 SelectObject
返回当前(旧(选择作为返回值 - 然后删除它。在您的情况下,您正在尝试删除仍然选定的位图。
PS:我没有看到CreateCompatibleDC
- 你在哪里创建兼容 DC?在CreateCompatibleBitmap
之前添加compatDC = CreateCompatibleDC( hdc );
。