首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何保存和恢复hdc?

如何保存和恢复hdc?
EN

Stack Overflow用户
提问于 2013-05-02 00:03:56
回答 1查看 627关注 0票数 0

我写了一个应用程序来绘制直线,矩形,椭圆在客户区。当我画任何东西时,我需要保存客户区的图像。当消息WM_PAINT出现时,我会将其恢复。

我使用HBITMAP保存和恢复

保存

代码语言:javascript
复制
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);

恢复

代码语言:javascript
复制
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);

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

EN

回答 1

Stack Overflow用户

发布于 2013-05-02 00:37:36

除非你真的打算以一种艰难的方式来做这件事,否则我会放弃这种方法。我认为有两个合理的选择:

  1. 只需在WM_PAINT中完成所有绘图。当你想让线条、矩形、椭圆等消失时,设置一些变量(或其他任何东西)来表示它们消失了,并使窗口失效以强制重绘。
  2. 会在当前窗口的工作区上创建另一个窗口。将其创建为一个分层窗口,并在其窗口类中设置CS_SAVEBITS样式。在这里画你的线条,椭圆等,当你想要它们消失的时候,简单地销毁窗口。

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16321787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档