转载:从Invalidate();方法理解windows消息机制_weixin_30512785的博客-程序员宅基地

原文:http://blog.csdn.net/ghevinn/article/details/23286151

<1>
Invalidate标记一个需要重绘的无效区域,并不意味着调用该函数后就立刻进行重绘。类似于PostMessage(WMPAINT),需要处理到WMPAINT消

息时才真正重绘。因为Invalidate之后还有其他的语句正在执行,程序没有机会去处理WMPAINT消息,但当函数执行完毕后,WMPAINT消息处

理才得以进行。 Invalidate只是放一个WMPAINT消息在队列里,不做别的,所以只有当当前函数返回后,进入消息循环,取出WMPAINT,再执

行PAINT,所以不管Invalidate放哪里,都是最后的。

InvalidateRect(hWnd,&rect,TRUE);向hWnd窗体发出WMPAINT的消息,强制客户区域重绘制, rect是指定要刷新的区域,此区域外的客户区

域不被重绘,这样可以防止客户区域一个局部的改动,而导致整个客户区域重绘而导致闪烁,如果最后的参数为TRUE,则还向窗体发送

WMERASEBKGND消息,使背景重绘,当然在客户区域重绘之前。 UpdateWindow()只向窗体发送WMPAINT消息,在发送之前判断GetUpdateRect

(hWnd,NULL,TRUE)看有无可绘制的客户区域,如果没有,则不发送WMPAINT。 如果希望立即刷新无效区域,可以在调用InvalidateRect之后

调用UpdateWindow,如果客户区的任一部分无效,则UpdateWindow将导致Windows用WMPAINT消息调用窗口过程(如果整个客户区有效,则不

调用窗口过程)。这一WMPAINT消息不进入消息队列,直接由WINDOWS调用窗口过程。窗口过程完成刷新以后立刻退出,WINDOWS将控制返回给

程序中UpdateWindow调用之后的语句。
-----------------------------------------
<2>

1. void Invalidate( BOOL bErase = TRUE );

  该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口,

那么原来被遮住的部分就是无效的,需要重绘。这时Windows会在应用程序的消息队列中放置WM_PAINT消息。MFC为窗口类提供了WM_PAINT的

消息处理函数OnPaint,OnPaint负责重绘窗口。视图类有一些例外,在视图类的OnPaint函数中调用了OnDraw函数,实际的重绘工作由OnDraw

来完成。参数bErase为TRUE时,重绘区域内的背景将被擦除,否则,背景将保持不变。


它和 UpdateWindow( )区别在于:
 UpdateWindow( )的作用是使窗口立即重绘。调用Invalidate等函数后窗口不会立即重绘,这是由于WM_PAINT消息的优先级很低,它需要等

消息队列中的其它消息发送完后才能被处理。调用UpdateWindow函数可使WM_PAINT被直接发送到目标窗口,从而导致窗口立即重绘。

2. InvalidateRect只是增加重绘区域,在下次WM_PAINT的时候才生效
InvalidateRect函数中的参数TRUE表示系统会在你画之前用背景色将所选区域覆盖一次,默认背景色为白色,可以通过设置BRUSH来改变背景

色。
Invalidate()之后:(MFC的,顺便了)
OnPaint()->OnPrepareDC()->OnDraw()
所以只是刷新在OnPaint()和OnDraw()函数中的绘图语句。其它地方没有影响。
Invalidate标记一个需要重绘的无效区域,并不意味着调用该函数后就立刻进行重绘。类似于PostMessage(WM_PAINT),需要处理到WM_PAINT

消息时才真正重绘。以为您Invalidate之后还有其他的语句正在执行,程序没有机会去处理WM_PAINT消息,但当函数执行完毕后,消息处理

才得以进行。
Invalidate只是放一个WM_PAINT消息在队列里,不做别的,所以只有当当前函数返回后,进入消息循环,取出WM_PAINT,才执行PAINT,所以

不管Invalidate放哪里,都是最后的。
InvalidateRect(hWnd,&rect,TRUE);向hWnd窗体发出WM_PAINT的消息,强制客户区域重绘制,
rect是你指定要刷新的区域,此区域外的客户区域不被重绘,这样防止客户区域的一个局部的改动,而导致整个客户区域重绘而导致闪烁,

如果最后的参数为TRUE,则还向窗体发送WM_ERASEBKGND消息,使背景重绘,当然在客户区域重绘之前。
UpdateWindow只向窗体发送WM_PAINT消息,在发送之前判断GetUpdateRect(hWnd,NULL,TRUE)看有无可绘制的客户区域,如果没有,则不发送

WM_PAINT
如果希望立即刷新无效区域,可以在调用InvalidateRect之后调用UpdateWindow,如果客户区的任一部分无效,则UpdateWindow将导致

Windows用WM_PAINT消息调用窗口过程(如果整个客户区有效,则不调用窗口过程)。这一WM_PAINT消息不进入消息队列,直接由WINDOWS调

用窗口过程。窗口过程完成刷新以后立刻退出,WINDOWS将控制返回给程序中UpdateWindow调用之后的语句。(windows程序设计第5版 P98)
UpdateData()顺便说下,这个函数不是刷新界面用的。
UpdateData();参数为FALSE时,将界面上控件绑定的变量的数据导到控件内,参数为TRUE时,导入方向则相反。

MSDN:

Invalidate Method
Clears the object's cached user information.

Syntax


DIDiskQuotaUser.Invalidate()

Return Value


No return value.


Remarks


This method clears the user information stored in the object's cache. The next time a request is made for quota-related

information, the object retrieves the information from the NTFS volume and refreshes the cache.


Method Information


Minimum DLL version shell32.dll version 5.0 or later
Minimum operating systems Windows 2000, Windows Me

from :http://wenjuanhe.blog.163.com/blog/static/7450172520099163818916/
------------------------------------------------
<3>
Invalidata()和UpdateWindows()的关系
系统会在多个不同的时机发送WM_PAINT消息:当第一次创建一个窗口时,当改变窗口的大小时,当把窗口从另一个窗口背后移出时,当最大

化或最小化窗口时,等等,这些动作都是由系统管理的,应用只是被动地接收该消息,在消息处理函数中进行绘制操作;大多数的时候应用

也需要能够主动引发窗口中的绘制操作,比如当窗口显示的数据改变的时候,这一般是通过InvalidateRect和 InvalidateRgn函数来完成的

。InvalidateRect和InvalidateRgn把指定的区域加到窗口的Update Region中,当应用的消息队列没有其他消息时,如果窗口的Update

Region不为空时,系统就会自动产生WM_PAINT消息。
系统为什么不在调用Invalidate时发送WM_PAINT消息呢?又为什么非要等应用消息队列为空时才发送WM_PAINT消息呢?这是因为系统把在窗

口中的绘制操作当作一种低优先级的操作,于是尽可能地推后做,这样有利于提高绘制的效率:在两个WM_PAINT消息之间多个Invalidate调

用使之失效的区域就会被累加起来,然后在一个WM_PAINT消息中一次得到更新,不仅能避免多次重复地更新同一区域,也优化了应用的更新

操作。像这种通过InvalidateRect和InvalidateRgn来使窗口区域无效,依赖于系统在合适的时机发送WM_PAINT消息的机 制实际上是一种异

步工作方式,也就是说,在无效化窗口区域和发送WM_PAINT消息之间是有延迟的;有时候这种延迟并不是我们希望的,这时我们当然可以在

无效化窗口区域后利用SendMessage 发送一条WM_PAINT消息来强制立即重画,但不如使用Windows GDI为我们提供的更方便和强大的函数:

UpdateWindow和RedrawWindow。UpdateWindow会检查窗口的Update Region,当其不为空时才发送WM_PAINT消息;RedrawWindow则给我们更多

的控制:是否重画非客户区和背景,是否总是发送WM_PAINT消息而不管Update Region是否为空等。

转载于:https://www.cnblogs.com/jianyongjohnwang/p/6797794.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30512785/article/details/99997809

智能推荐

【原创】Xadmin配置详情_Python_anning的博客-程序员宅基地

 此文为Python_anning原创,未经允许,不得随意转载! 首先安装Xadmin 由于Xadmin安装无法安装到最新,要最新版的可以去GitHub上Clone下来。 Xadmin GitHub地址https://github.com/sshwsfc/xadminpip install Django-Xadmin接下来需要在settings里的INSTALLED_APPS中注册...

分享java压力测试模版类 版本2_IamLsz的博客-程序员宅基地

在上一次,我们分享了一个压力测试的模板类,在模板类里面通过继承然后实现重写几个方法即可以实现压力测试,其本质就是由实现者去实现具体的测试逻辑,将功能代码独立抽离出来实现复用。然而,继承存在着一些缺点是无法避免的。比如具体的失去了灵活性,而且如果java不支持多继承,意味着测试类会被限制少了继承其他类的能力,再者之前的代码对外部暴露的接口过多,无法对用户实现彻底的透明。因此对原先的代码采用了Func

HDU2049不容易系列之(4)——考新郎 错排_DouglasConnor的博客-程序员宅基地

不容易系列之(4)——考新郎Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 50923 Accepted Submission(s): 18570Problem Description国庆期间,省城HZ刚刚举行了一场盛大的集体...

HDU2049不容易系列之(4)——考新郎 错排_DouglasConnor的博客-程序员宅基地

不容易系列之(4)——考新郎Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 50923 Accepted Submission(s): 18570Problem Description国庆期间,省城HZ刚刚举行了一场盛大的集体...

jsp网页实现自动刷新和自动跳转页面_一年实习生的博客-程序员宅基地

自动刷新:1就代表1秒刷新response.setHeader("refresh","1");自动跳转:2秒后跳转到另一个链接 response.setHeader("refresh","2;URL=链接");完整代码:&lt;%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="...

使用weinre调试Web应用及PhoneGap应用_weixin_34195142的博客-程序员宅基地

Web开发者经常使用Firefox的firebug或者Chrome的开发人员工具进行Web调试,包括针对JavaScript,DOM元素和CSS样式的调试。但是,当我们期望为移动Web站点或应用进行调试时,这些工具就很难派上用场。weinre就是一个帮助我们在桌面来远程调试运行在移动设备浏览器内的Web页面或应用的调试工具。weinre是WEb INspector REmote的简写。本文...

随便推点

Vue--安装与HelloWord--MVVM模式小实例_weixin_30920513的博客-程序员宅基地

1.官网下载开发板vue.js文件2.HelloWorld!3.MvvM实例&lt;!DOCTYPE html&gt;&lt;html&gt; &lt;head&gt; &lt;meta charset="utf-8"&gt; &lt;title&gt;helloworld&lt;/title&gt; ...

百位红人助阵,如涵这场影响力盛典点亮夜钱塘_智瑾财经的博客-程序员宅基地

5月27日晚6点半,如涵在杭州大剧院举办的你创造影响力——“如涵盛典”如期举行,红人齐聚,场外灯光秀加持,更有知名艺人张韶涵作为嘉宾现场助阵。此次盛典,如涵邀请到了抖音、快手、B站、小红书等平台大佬,还有纽西之谜全程友情陪伴,更有多家优质品牌一同助力此次盛会。华丽舞美,靓丽灯光,一场声势浩大的光电大秀在杭城最耀眼的日月星辰间上演。本次盛会以“数字、时尚、消费”为宣传重点,重点推广浙江省数字经济改革,搭建各类社交平台与品牌沟通的桥梁,旨在为用数字化IP的规模矩阵,联动上游的品牌方和下游的消费者,依托科技创

osg06: osg3.3.8 开关节点_dododododoooo的博客-程序员宅基地_osg开关节点

注意:摘自OpenSceneGraph三维渲染引擎编程指南

normdist java,NORMDIST函数没有给出正确的输出_George Gabriel的博客-程序员宅基地

I'm trying to use NORMDIST function in Excel to create a bell curve, but the output is strange.My mean is 0,0000583 and standard deviation is 0,0100323 so when I plug this to the function NORMDIST(0,0...

Java Thread Dump日志分析_旧书包的青春的博客-程序员宅基地

三个实例演示 Java Thread Dump 日志分析jstack Dump 日志文件中的线程状态dump 文件里,值得关注的线程状态有:死锁,Deadlock(重点关注)执行中,Runnable等待资源,Waiting on condition(重点关注)等待获取监视器,Waiting on monitor entry(重点关注)暂停,Suspended对象等待中,Object.wait() 或 TIMED_WAITING阻塞,Blocked(重点关注)停止,Parked下面我们先

虚拟机打不开问题_温润如风的博客-程序员宅基地

有时候我们使用的虚拟机中的系统打不开了,或者是在后台运行,找不到窗口来打开了,强制结束进程会看到虚拟机打不开了。千万别慌,这个只是虚拟机记录了系统的一些状态,我们把这个虚拟机所在的目录下的一个文件删除旧可以了。然后再点击虚拟机2步搞定

推荐文章

热门文章

相关标签