【发布时间】:2013-04-25 15:58:42
【问题描述】:
我编写了一个应用程序来在客户区绘制直线、矩形、椭圆。当我画任何东西时,我需要保存客户区的图像。当出现 WM_PAINT 消息时,我会恢复它。
我使用HBITMAP保存和恢复
保存
RECT rc;
GetClientRect(hMain, &rc); // hMain: handle main window
hdc = GetDC(hMain);
HDC hdcMem = CreateCompatibleDC(hdc);
// hbm: handle bitmap to save and restore
hbm = CreateCompatibleBitmap(hdc, rc.right - rc.left, rc.bottom - rc.top);
SelectObject(hdcMem, hbm);
BitBlt(hdcMem, 0, 0, rc.right - rc.left, rc.bottom - rc.top,
hdc, rc.right - rc.left, rc.bottom - rc.top, SRCCOPY);
ReleaseDC(hMain, hdc);
恢复
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hMain, &ps);
FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));
HDC hdcMem = CreateCompatibleDC(hdc);
SelectObject(hdcMem, hbm);
BitBlt(hdc, 0, 0, rc.right - rc.left, rc.bottom - rc.top,
hdcMem, rc.right - rc.left, rc.bottom - rc.top, SRCCOPY);
ReleaseDC(hMain, hdc);
EndPaint(hMain, &ps);
但它不起作用。请帮帮我。
【问题讨论】:
-
你不能用简单的方法在 WM_PAINT 中绘制(或代替)吗?
-
这在保存端和恢复端都是错误的。保存端将仅捕获可见像素。不可见的像素(例如,被另一个窗口覆盖)将不会被捕获。恢复端在
WM_PAINT消息之外调用BeginPaint,不建议这样做。在这种情况下,它获得了一个被完全剪掉的 DC,因为没有任何东西是无效的。您应该在WM_PAINT内完成所有工作 - 当您想要替换客户区时,绘制替换。当你想恢复旧的客户区时,执行旧的绘图代码。