其中引用了下篇文章:
http://topic.csdn.net/u/20081202/09/6612652d-be28-4042-8269-0f3b87c03f8e.html
一:什么时候才会发生重绘窗口的消息?
当需要更新或重新绘制窗口的外观时,应用程序就会发送WM_PAINT消息。对窗口进行重新绘制。
二:Invalidate() -- RedrawWindow() -- UpdateWindow()三个函数有什么异同?
Invalidate()是强制系统进行重画,但是不一定就马上进行重画。因为Invalidate()只是通知系统,此 时的窗口已经变为无效。强制系统调用WM_PAINT,而这个消息只是Post就是将该消息放入消息队列。当执行到WM_PAINT消息时才会对敞口进行重绘。
UpdateWindow只向窗体发送WM_PAINT消息,在发送之前判断GetUpdateRect(hWnd,NULL,TRUE)看有无可绘制的客户区域,如果没有,则不发送WM_PAINT。
RedrawWindow()则是具有Invalidate()和UpdateWindow()的双特性。声明窗口的状态为无效,并立即更新窗口,立即调用WM_PAINT消息处理。
三:刷新组合
InvalidateRect(hctrl,null,true) ;
UpdateWindow(hctrl);
这两个函数组合起来是什么意思呢?
InvalidateRect是会触发WM_PAINT事件,但是不是立即就触发,一般都会等当前操作的过程结束才触发, 如果需要立即触发,那么配合UpdateWindow()使用就可以了。先执行InvalidateRect,再执行UpdateWindow().
/************************************************************************************/
还有一篇文章也可以,不过好像有些问题。
http://read.newbooks.com.cn/info/144737.html
Invalidate
在消息队列中加入一条
WM_PAINT
消息,其无效区为整个客户区。
UpdateWindow
直接发送一个
WM_PAINT
消息,其无效区范围就是消息队列中
WM_PAINT
消息(最多只有一条)的无效区。
效果很明显,当调用
Invalidate
之后,屏幕不一定马上更新,因为
WM_PAINT
消息不一定在队列头部,而调用
UpdateWindow
WM_PAINT
消息马上执行的,绕过了消息队列。
Invalidate
之后想马上更新屏幕,那就加上
UpdateWindow()
这条语句。
MSDN的解释
UpdateWindow
The UpdateWindow function updates the client area of the specified window by sending a WM_PAINT
message to the window if the window's update region is not empty. The function sends a WM_PAINT
message directly to the window procedure of the specified window, bypassing the application queue.
If the update region is empty, no message is sent.
InvalidateRect
The system sends a WM_PAINT message to a window whenever its update region is not empty and
there are no other messages in the application queue for that window.
翻译成中文大概的解释如下:
UpdateWindow:
如果有无效区,则马上sending a WM_PAINT message到窗口处理过程,不进消息队列进行排队等待,立即刷新窗口,否则,什么都不做。
InvalidateRect:设置无效区,如果为NULL参数,则设置整个窗口为无效区。当应用程序的那个窗口的消息队列为空时,则sending a WM_PAINT message(即使更新区域为空).在sending a WM_PAINT message的所有InvalidateRect的更新区域会累加。
1:设置无效区
InvalidateRect
2:立即刷新
UpdateWindow();
如果不调用 InvalidateRect就调用 UpdateWindow,那么UpdateWindow什么都不做。
??????
如果调用 InvalidateRect 后不调用UpdateWindow,则系统会自动在窗口消息队列为空的时候,系统自动发送一WM_PAINT消息。
调用UpdateWindow()时将会发送一个WM_PAINT消息,而应用程序在接收到WM_PAINT消息后,将自动地调用Invalidate(),
所以,在程序代码中,不一定要出现Invalidate()!
UpdateWindow()就是立即发送WM_PAINT消息,只对声明无效的区域起作用,
Invalidate()则是声明无效的方式之一。
Invalidate()表示客户区域无效
,在下次WM_PAINT发生时重绘。
而WM_PAINT是由系统进行维护的,每当CWnd的更新区域不为空,并且在应用程序的窗口消息队列中没有其它消息时,Windows就发送一条WM_PAINT消息
。
Invalidate里面有个bool型的参数,用来标识重绘的时候是否用背景色填充。是不是用SetBkcolor函数?下去继续研究。
updateWindow则是要求系统对区域进行立即重绘。
看到有人在网上提出问题,他在Invalidate后面又写了绘图的函数但是没有执行,因为invalidate执行过以后转到PAINT命令了。所以后面的都没有显示。
也终于想通我绘的图一直在闪啊闪,因为我在PAINT里面用到Invalidate()函数,所以他不停的自嵌套,倒是绘的图不停的闪。
Invalidate让客户区处于可以重画的状态,而UpdateWindow开始重画,但是它先判断客户区是否为空,不空UpdateWindow不执行,为空才执行重画。
Invalidat最后也是调用InvalidatRect
,在windows API里只有InvalidatRect的
本文主要分享
windows
的消息机制和win32创建
窗口
的过程
Windows
消息机制
Windows
是依靠消息驱动的。用户创建
窗口
后,对
窗口
进行操作,程序应该根据用户的操作而有所响应。但是,程序如何知道用户在
窗口
上的动作呢?是操作系统告诉程序的。
Windows
不断向应用程序发送消息,通知它发生了什么事情。这个过程是通过被称为
窗口
函数
或消息处理
函数
的
函数
完成的
Android 界面
刷新
Android提供了
Invalid
ate
方法实现界面
刷新
,但是
Invalid
ate
不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用。
Android程序中可以使用的界面
刷新
方法有两种,分别是利用Handler和利用post
Invalid
ate
()来实现在线程中
刷新
界面。
利用Handler
刷新
界面
实例化一个Handler对象,并重写handleMessage方法调用
invalid
ate
()实现界面
刷新
;而在线程中通过sendMessage发送界面更新消息。
// 在onCre
ate
根据fuRe
draw
旗标的设置,重画全部或部分
窗口
SDK中的
函数
原型
BOOL Re
draw
Window
(HWND hwnd,CONST RECT* lprc
Update
,HRGN hrgn
Update
,UINT fuRe
draw
);
Long,非零表示成功,零表示失败。会设置GetLastError
因为控件自绘工程skinui的缺陷,在
窗口
Move的时候会出现残影残留的现象,为了解决残留的问题,需要移动后马上让
窗口
立马
刷新
一下。这时,需要直接去
刷新
窗口
并立即生效。经研究,可以使用下面的办法,如下所示:
HWND hWnd = GetSafeHwnd();
::
Invalid
ate
( hWnd );
::
Update
Window
( hWnd );
结合msdn,让我
Windows
的
API
(Application Programming Interface,应用程序编程接口),是
Windows
操作系统提供给应用程序的大量
函数
,学习本课程,不仅可以掌握
Windows
界面编程,开发华丽的
Windows
桌面运用程序,也可以为MFC框架的学习奠定扎实的基础,同时是否熟练的掌握
Windows
API
开发,也是企业考量优秀程序员一个非常重要的指标!
调用过程及分析
Invalid
ate
Window
( )------->WM_
Invalid
Rect( )--------------->WM_ClipAtParentBorders( ),_
Invalid
ate
Abs( )
前两个
函数
没什么特别的WM_C