MFC 窗口重绘问题

简介: 在客户区画直线等图形时, 发现当其最小化或者其他窗口遮挡时,出现窗口重绘,而将原来绘制的图形删除,上网上搜索知道,绘制图形的代码必须放置在Ondraw函数中,才能避免重绘时图形消失(因为一直在响应WM_PAINT消息,不断的重绘),但是这样做却只能保存最近的一次绘图,只适用于单幅固定的图形,对于其中有多幅图形就不能这么做了,解决的思路是:考虑到MFC时 文档/视图 类,视图CView负责数据的显示和修改,文档CDocument类负责数据的存储和加载,从而把数据管理和显示方法分离开来。

在客户区画直线等图形时, 发现当其最小化或者其他窗口遮挡时,出现窗口重绘,而将原来绘制的图形删除,上网上搜索知道,绘制图形的代码必须放置在Ondraw函数中,才能避免重绘时图形消失(因为一直在响应WM_PAINT消息,不断的重绘),但是这样做却只能保存最近的一次绘图,只适用于单幅固定的图形,对于其中有多幅图形就不能这么做了,解决的思路是:考虑到MFC时 文档/视图 类,视图CView负责数据的显示和修改,文档CDocument类负责数据的存储和加载,从而把数据管理和显示方法分离开来。我们在CDocument类中添加一个CBitMap对象,将每次中间绘图时的客户区的内容保存成BitMap,当所有的操作都执行好以后,将最终的BitMap拷贝到屏幕中,这就是所谓的内存缓存画图方式。这么做还有一个好处就是更新是看不到闪烁。

具体代码如下:

1、中间图形处理过程(事先已经在CDrawDoc类中添加了变量CBitmap m_bmpBuf;):

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
 CDC *pDC = GetDC();
 CDrawDoc *pDoc = GetDocument();
 CDC dcMem;

dcMem.CreateCompatibleDC(NULL);
 CRect rect;
 GetClientRect(&rect); //获取客户区域
 pDoc->m_bmpBuf.DeleteObject();
 pDoc->m_bmpBuf.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
 CBitmap *pOldBitmap = dcMem.SelectObject(&pDoc->m_bmpBuf);//将创建好的m_bmpBuf添加到临时的CDC的Object中,类似于在墙上先糊上墙纸^_^,先在墙纸上作画,最后将最终形成的画拷贝到墙上。
 m_ptEnd = point;

 dcMem.BitBlt(0,0,rect.Width(),rect.Height(),pDC,0,0,SRCCOPY);

 dcMem.SelectObject(pOldBitmap); //将pDC即当前客户区里面的内容拷贝到临时的MEM中,MEM虽然过后会被delete掉,但是它更新了CDocument类中的m_bmpBuf
 m_bDraw = false;
 dcMem.DeleteDC();
}

2、最终显示(在OnDraw中实现):

void CDrawView::OnDraw(CDC* pDC)
{
 CDrawDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 if (!pDoc)
  return;
 CRect rect;
 GetClientRect(&rect);
 CDC dcMem;//以下是输出位图的标准操作
 CBitmap *pOldBitmap = NULL;
 dcMem.CreateCompatibleDC(NULL);
 pOldBitmap = dcMem.SelectObject(&pDoc->m_bmpBuf);
 
 pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,SRCCOPY);
 dcMem.SelectObject(pOldBitmap); //将dcMeM中的bitmap拷贝到当前客户区
 dcMem.DeleteDC();

}

 

目录
相关文章
|
物联网 机器人 Swift
|
9月前
|
Kubernetes 算法 调度
阿里云 ACK FinOps成本优化最佳实践
本文源自2024云栖大会梁成昊演讲,讨论了成本优化策略的选择与实施。文章首先介绍了成本优化的基本思路,包括优化购买方式、调整资源配置等基础策略,以及使用弹性、资源混部等高级策略。接着,文章详细探讨了集群优化和应用优化的具体方法,如使用抢占式实例降低成本、通过资源画像识别并优化资源配置,以及利用智能应用弹性策略提高资源利用效率。
|
负载均衡 搜索推荐 区块链
P2P网络中中央服务器的作用
P2P网络中中央服务器的作用
|
11月前
|
移动开发 前端开发 Swift
iOS 最好的应用程序开发编程语言竟然是这7种
iOS 最好的应用程序开发编程语言竟然是这7种
362 8
|
存储 编解码 监控
深入剖析:DVR与NVR的核心技术差异
【4月更文挑战第21天】
1566 0
|
Java 计算机视觉
我的自描外挂制作日志——FPS类游戏的自瞄【优化改进2】
我的自描外挂制作日志——FPS类游戏的自瞄【优化改进2】
237 0
|
Ubuntu iOS开发 MacOS
Qt5标题栏自定义QHeaderView自定义
Qt5标题栏自定义QHeaderView自定义
285 0
|
iOS开发 MacOS Python
Mac:安装Python3并配置环境变量(本地多个Python版本选择配置)
Mac:安装Python3并配置环境变量(本地多个Python版本选择配置)
14836 0
Mac:安装Python3并配置环境变量(本地多个Python版本选择配置)
|
C++ Windows 容器
CListCtrl使用详解
1。先来介绍REPORT类型的CListCtrl: 首先使用下面的语句设置CListCtrl的style:   DWORD   SetExtendedStyle(   DWORD   dwNewStyle   ); 其中   LVS_EX_CHECKBOXES   表示添加CheckBox   LV...
1265 0