我在互联网上阅读了很多示例,但我仍然陷入困境。我正在尝试处理发送到我的应用程序的 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 cache ),这可能在短期内有效,但最终会在最不方便的时候停止工作。或者,当您没有 DC 时,您可能会想使用 DC 指针,并且会在其他内容上乱写乱画(或者由于 GDI 对象线程关联而无法这样做)。
访问 WM_PAINT
之外的窗口 DC 的正确方法是调用 GetDC(hwnd)
。
CreateCompatibleDC()
创建与 hdc
兼容的内存 DC。绘制到compatDC
不足以绘制到hdc
;绘制到compatDC
后,需要绘制回hdc
。对于您的情况,您需要进行两次 BitBlt()
调用;第二个将从 compatDC
传输回 hdc
。 See this sample code for details.
当您将位图选择到 DC 中时,您无法DeleteObject()
位图。您的 SelectObject(compatDC, oldBitmap)
调用需要在 DeleteObject(compatBitmap)
之前进行。 (这就是 i486 试图在他的回答中表达的意思。)
(我确信这个答案在某些地方有误导性或不完整;如果有,请告诉我。)
关于c - 处理 WM_PAINT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27502290/