如何保存hdc并恢复它?

时间:2013-05-01 16:03:56

标签: c++ winapi bitblt hdc

我编写了一个应用程序来绘制客户区域中的line,rect,ellipse。当我画任何东西时,我需要保存客户区的图像。当消息WM_PAINT出现时我恢复它。

我使用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);

但它不起作用。请帮帮我。

1 个答案:

答案 0 :(得分:3)

除非你真的这么做,否则我会放弃这种做法。我看到两个合理的选择:

  1. 只需完成WM_PAINT中的所有绘图。当你想要线条,矩形,椭圆等消失时,设置一些变量(或其他)来表示它们已经消失,并使窗口无效以强制重绘。这是传统方式,大部分时间都可以找到工作。

  2. 创建一个覆盖当前窗口客户区的第二个窗口。将其创建为窗口类中设置了CS_SAVEBITS样式的分层窗口。在这里画出你的线条,椭圆等,当你希望它们消失时,只需破坏它。

  3. CS_SAVEBITS会自动执行您现在尝试执行的操作:在窗口下保存区域的位图,用于在CS_SAVEBITS窗口时(完全自动)恢复基础窗口消失。这个和你当前尝试做的事情都有同样的问题:保存的位图跟踪底层窗口中的任何更改 - 它们只是恢复当创建上部窗口时,可能会变得陈旧。只有当底层窗口在此期间保持静态时,它才能正常工作。

    如果这是一个问题,请结合使用两种方法:在覆盖窗口中取消CS_SAVEBITS。当它被破坏时,底层窗口将失效,并通过正常的重绘逻辑恢复自身。

相关问题