我编写应用程序来绘制线,矩形,椭圆形在客户区。当我绘制任何东西时,我需要保存客户区的图像。当WM_PAINT消息出现时我将其恢复。如何保存hdc并恢复它?
我用HBITMAP来保存和恢复
SAVE
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);
RESTORE
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绘图以及(或代替)? – john 2013-05-01 16:23:35
这在保存侧和恢复侧都是错误的。保存侧将只捕获可见像素。不可见的像素(例如,被另一个窗口覆盖)将不会被捕获。恢复方在WM_PAINT消息外调用'BeginPaint',这是不推荐的。在这种情况下,它会获得完全删除的DC,因为没有任何内容无效。你应该在'WM_PAINT'内完成所有的工作 - 当你想替换客户区时,绘制替换。当你想恢复旧的客户区时,执行旧的绘图代码。 – 2013-05-02 19:46:18