先看一段代码:

void CFeatureEdit_LinePolyDLG::DrawRectAll(int type)
{
 CClientDC dc(this);
 //底框画笔
 CPen penRect(PS_DOT,1,RGB(0,125,0));
 CPen *oldPenRect = (CPen*)dc.SelectObject(&penRect);
 CBrush brRect(RGB(255,255,255));
 CBrush *oldbrRect = (CBrush*)dc.SelectObject(&brRect);
 //
 InvalidateRect(&m_RectShowFillImage);//设置无效区
//Draw something in m_RectShowFillImage……
 //
 InvalidateRect(&m_RectShowLineType);//设置无效区
//Draw something in m_RectShowLineType……

//
 dc.SelectObject(&oldPenRect);
 penRect.DeleteObject();
 dc.SelectObject(&oldbrRect);
 brRect.DeleteObject();
}

这段代码用来绘制几个区域图案,对话框并没有重载OnPaint()函数,也没调用Invalidate()设置整个客户区为无效区,打算手动发送WM_PAINT消息开进行刷新。

一开始使用InvalidateRect()进行无效区域设置,但是绘制的图案并没有显示。

查阅资料,发现InvalidateRect()设置无效区后,会发送一条WM_PAINT消息到消息队列。但是由于WM_PAINT的优先级很低,因此并不能及时的进行处理。

怀疑是此处问题,资料中发现,UpdateWindow()可以绕过消息队列,直接向窗体提交WM_PAINT消息,并且其无效区域将自己调用GetUpdateRect获得,即为上一条WM_PAINT设置的无效区域,然后窗体会立即处理此消息;

因此在InvalidateRect()调用之后直接调用UpdateWindow(),代码部分修改如下:

InvalidateRect(&m_RectShowFillImage);//设置无效区

UpdateWindow();

//Draw something in m_RectShowFillImage……

InvalidateRect(&m_RectShowLineType);//设置无效区

UpdateWindow();

//Draw something in m_RectShowLineType……

果然可以实现预定功能。

但是就此处存在几个疑问疑问如下:

(1)既然InvalidateRect也发送了重绘消息,在未加UpdateWindow之前调试也能看到绘制成功,为何跳出该函数(DrawRectAll)时图案还存在,但是继续运行之后就消失了?

(2)理论上加不加UpdateWindow只会出现绘制先后的差别,为何在此段代码中重新绘制图案后会被覆盖掉?

(3)如何查看消息队列?

关于MFC中InvalidateRect()的思考与疑问的更多相关文章

  1. MFC中快速应用OpenCV(转)

    转载链接:http://wiki.opencv.org.cn/index.php/MFC%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%BA%94%E7%94%A8OpenCV 简介和缘 ...

  2. 你的MySQL服务器开启SSL了吗?SSL在https和MySQL中的原理思考

    最近,准备升级一组MySQL到5.7版本,在安装完MySQL5.7后,在其data目录下发现多了很多.pem类型的文件,然后通过查阅相关资料,才知这些文件是MySQL5.7使用SSL加密连接的.本篇主 ...

  3. MFC中的一般经验之谈3

    Window消息可以分为三类:(1)标准Window消息(CWnd子类处理),(2)控制通知消息(CWnd子类处理),(3)命令消息(应用中的5类都可以).所有派生自CCmdObjec对象的类都可以处 ...

  4. GDI+学习笔记(九)带插件的排序算法演示器(MFC中的GDI+实例)

    带插件的排序算法演示器 请尊重本人的工作成果,转载请留言.并说明转载地址,谢谢. 地址例如以下: http://blog.csdn.net/fukainankai/article/details/27 ...

  5. 【MFC】MFC中窗口重绘

    MFC中窗口重绘 摘自:http://blog.csdn.net/shuilan0066/article/details/5859057 在刷新窗口时经常要调用重绘函数 MFC提供了三个函数用于窗口重 ...

  6. MFC中使用FLASH

    一.准备工作 第一步:下载并安装Adobe Flash Player. 从官方网站(http://get.adobe.com/cn/flashplayer/)上下载最新的Flash Player(大约 ...

  7. MFC中换行实现

    在mfc中编辑框允许输入多行时,换行符被表示为<归位><换行>即"\r\n",用ascii码表示为13 10 如果为编辑框中想要输入换行,就请将编辑框的属性 ...

  8. MFC中的各种DC区别

    转载自:xntop的<区别MFC中的CClientDC.CWindowDC.CPaintDC.CMetaFileDC> CClientDC及其子类 1. CClientDC类只能在客户区绘 ...

  9. VC++ MFC中如何将应用程序的配置信息保存到注册表中(二)

    在上一篇中介绍了几个写入注册表数据和读取注册表数据的接口,并介绍了使用方法. 这一片教你如何使得你的应用程序在下次打开时保持上一次关闭前的状态. 在上一篇添加的代码的基础上,要添加WM_CLOSE消息 ...

随机推荐

  1. AngularJs中ng-controller下的函数在调用时为什么会执行两次?

    最近在学习AngularJs的过程中,自己做了个demo,但程序运行后却发现有个地方运行不对劲,纠结了半天,也问了,也查了,但是没有一个满意的答案,所以特地贴出来,请教各位大神(先说声谢谢了!).为了 ...

  2. Java IO流学习总结三:缓冲流-BufferedInputStream、BufferedOutputStream

    Java IO流学习总结三:缓冲流-BufferedInputStream.BufferedOutputStream 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/ ...

  3. j2se 总结

    j2se在学习第二遍的时候,感觉还是比较亲切的.

  4. Glusterfs下读写请求的处理流程

    Glusterfs基于内核的fuse模块,fuse模块除了创建fuse文件系统外,还提供了一个字符设备(/dev/fuse),通过这个字符设备,Glusterfs可以读取请求,并发送响应,并且可以发送 ...

  5. MySQL索引创建、删除、查看

    主键索引   PRIMARY KEY索引仅是一个具有名称PRIMARY的UNIQUE索引.这表示一个表只能包含一个PRIMARY KEY,因为一个表中不可能具有两个同名的索引. ALTER TABLE ...

  6. 重新认识一个强大的 Gson

    从一个 Bug 说起 不知道你们发现没有,你写完的程序无论当时怎么测试,过一段时间总会出 Bug .再说一个每天都在发生的例子:在你写完一篇博客后,立即检查的话,总是查不出自己写的错别字. 据说这些都 ...

  7. POJ 2914 Minimum Cut Stoer Wagner 算法 无向图最小割

    POJ 2914 题意:给定一个无向图 小于500节点,和边的权值,求最小的代价将图拆为两个联通分量. Stoer Wagner算法: (1)用类似prim算法的方法求"最大生成树" ...

  8. shell-早间学习,每日一点

    1.定位行: sed -n '12,~3p' pass #从第12行开始,直到下一个3的倍数行(12-15行) sed -n '12,+4p' pass #从第12行开始,连续4行(12-16行) s ...

  9. Javascript匿名函数

    单独的匿名函数无法运行,就算能运行,也无法调用.解决办法如下: 法1. //把匿名函数赋值给变量 var box=function(){ return "Lee"; }; aler ...

  10. ORM 实现数据库表的增删改查

    这次通过反射技术来实现一下数据库表的增删改查对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping) 注:引用时约束了以下几点: 数据 ...