我写了一个应用程序来绘制直线,矩形,椭圆在客户区。当我画任何东西时,我需要保存客户区的图像。当消息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);但它不起作用。请帮帮我。
发布于 2013-05-02 00:37:36
除非你真的打算以一种艰难的方式来做这件事,否则我会放弃这种方法。我认为有两个合理的选择:
CS_SAVEBITS样式。在这里画你的线条,椭圆等,当你想要它们消失的时候,简单地销毁窗口。CS_SAVEBITS会自动执行您现在正在尝试执行的操作:保存窗口下区域的位图,用于在CS_SAVEBITS窗口消失时恢复底层窗口(完全自动)。这和您当前尝试做事情的方式都有相同的问题:保存的位图不会跟踪底层窗口中的任何更改--它们只是恢复创建上层窗口时的内容,这可能会变得陈旧。只有当底层窗口在持续时间内保持静态时,它才能正常工作。
如果这是一个问题,可以结合使用这两种方法:在覆盖窗口上关闭CS_SAVEBITS。当它被销毁时,底层窗口将失效,并通过正常的重新绘制逻辑恢复自身。
https://stackoverflow.com/questions/16321787
复制相似问题