MFC 窗口重绘问题

在客户区画直线等图形时, 发现当其最小化或者其他窗口遮挡时,出现窗口重绘,而将原来绘制的图形删除,上网上搜索知道,绘制图形的代码必须放置在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();

}

 

时间: 2024-09-28 22:20:49

MFC 窗口重绘问题的相关文章

动画窗口重绘-MFC动画窗口的重绘 窗口重绘

问题描述 MFC动画窗口的重绘 窗口重绘 10C 动画窗口重绘 在窗口的显示过程中有动画效果 但是这个窗口是无边框 又贴了一些控件的窗口 请问此窗口如何重绘??? 解决方案 在刷新窗口时经常要调用重绘函数MFC提供了三个函数用于窗口重绘InvalidateRect(&Rect)Invalidate()UpdateWindow()当需要更新或者重绘窗口时,一般系统会发出两个消息WM_PAINT(通知客户区有变化)和WM_NCPAINT(通知非客户区有变化)–WM_NVPAINT系统会自己搞定–WM

c#窗体-C#请问窗口重绘后内容不消失怎么办到的啊~~~~~~~~

问题描述 C#请问窗口重绘后内容不消失怎么办到的啊~~~~~~~~ private void pictureBox1_Paint(object sender, PaintEventArgs e) { Graphics g = Graphics.FromImage(myBitmap); g.DrawLine(myPen, pStart, pEnd); e.Graphics.DrawImage(myBitmap, 0, 0); .... } 怎么补充完这个代码中的内容啊~使C#大小化后不重绘.

MFC-4简单的窗口重绘(非部分重绘)

#include <afxwin.h> #include "resource.h" #include <afxtempl.h> //定义模板类的头文件 class MyDocument : public CDocument { public: CArray<CPoint,CPoint &> pArray;//<保存的数据类型,读取保存数据类型的返回值> void AddPoint(CPoint p) { pArray.Add(p)

Win32开发入门(3) 窗口的重绘

我们今天来吹一下关于窗口重绘的事情,在开始吹牛之前,我们先用上一篇博文中说到的方法写一 个简单的Win32应用程序.代码如下: #include <Windows.h> //先声明一下消息处理函数 LRESULT CALLBACK MyWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); // 入口点 int CALLBACK WinMain( HINSTANCE hInstance, HINSTANCE hPrvInst

自定义jQuery插件方式实现强制对象重绘的方法_jquery

本文实例讲述了自定义jQuery插件方式实现强制对象重绘的方法.分享给大家供大家参考.具体实现方法如下: jQuery.fn.redraw = function(){ jQuery(this).each(function(){ this.style.display='none'; this.offsetHeight; // no need to store this anywhere, the reference is enough this.style.display='block'; });

窗口被其他程序覆盖后,重新显示时不会重绘

问题描述 (MFC)注释掉窗口函数Onpaint中的CDialog::OnPaint();,当窗口被其他程序覆盖后,重新显示时不会重绘,只显示空白窗口对话框,使用鼠标拖动一下,就恢复正常了,请高手指点应该怎么做啊. 解决方案 本帖最后由 hailinouc 于 2014-11-20 08:20:18 编辑

MFC单文档如何用.BMP位图重绘非客户区

问题描述 MFC单文档如何用.BMP位图重绘非客户区 20C 功能:新建一个MFC单文档程序,微软原生的边框背景不好看.想用一张.bmp位图重绘非客户区. 困难:我在OnNcPaint()加载.bmp位图后,全部都遮盖住了,然后鼠标点击屏幕任一处,边框就还原为微软默认的了.何解? 请各位前辈多多指点,赠送20个C币,表示衷心的感谢! 解决方案 参考:http://blog.csdn.net/shuilan0066/article/details/6635458http://blog.csdn.n

c++-关于MFC窗口尺寸变化重画问题

问题描述 关于MFC窗口尺寸变化重画问题 问题的链接在这里,谢谢http://zhidao.baidu.com/question/1604266407975887067.html?quesup2&oldq=1

c++-MFC CListView 如何能把表头重绘

问题描述 MFC CListView 如何能把表头重绘 MFC CListView 如何能把表头重绘.. 系统的实在不好看啊..(不能重绘去掉也行) 我是想把第一行绘制成搜索框的..是否可行? 解决方案 加上样式LVS_NOCOLUMNHEADER (也可以在资源编辑器里属性里勾选) 然后再加上一个文本框作为搜索框