其中引用了下篇文章: 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