0

我编写了一个应用程序来在客户区画线、矩形、椭圆。当我画任何东西时,我需要保存客户区的图像。当出现 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);

但它不起作用。请帮我。

4

1 回答 1

3

除非您真的打算以艰难的方式做到这一点,否则我会放弃这种方法。我看到两个合理的选择:

  1. 只需在 WM_PAINT 内完成所有绘图。当您希望线条、矩形、椭圆等消失时,请设置一些变量(或其他)以指示它们已消失,并使窗口无效以强制重绘。这是传统的方式,大部分时间都能找到作品。

  2. 创建第二个窗口覆盖当前窗口的客户区。将其创建为具有CS_SAVEBITS在其窗口类中设置的样式的分层窗口。在此处绘制线条、椭圆等,并在您希望它们消失时简单地破坏窗口。

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

如果这是一个问题,请结合这两种方法:在覆盖窗口上去掉 CS_SAVEBITS。当它被销毁时,底层窗口将失效,并通过正常的重新绘制逻辑恢复自身。

于 2013-05-01T16:37:35.650 回答