码迷,mamicode.com
首页 > Windows程序 > 详细

Invalidate、RedrawWindow与UpdateWindow的差别

时间:2019-03-16 09:59:50      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:passing   网上   ges   出现   意思   ctrl   是什么   size   set   

一:什么时候才会发生重绘窗体的消息?

????? 当须要更新或又一次绘制窗体的外观时。应用程序就会发送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().

/************************************************************************************/

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的

Invalidate、RedrawWindow与UpdateWindow的差别

标签:passing   网上   ges   出现   意思   ctrl   是什么   size   set   

原文地址:https://www.cnblogs.com/ldxsuanfa/p/10540558.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
分享档案
周排行
mamicode.com排行更多图片
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!