Invalidate和UpdateWindow的区别

转载 2011年01月10日 15:45:00

在编程的时候经常把UpdateData、Invalidate、InvalidateRect和UpdateWindow四个函数混淆,在这里将简单介绍它们的区别。
UpdateData():

    当你使用了ClassWizard建立了控件和变量之间的联系后:当你修改了变量的值,而希望对话框控件更新显示,就应该在修改变量后调用UpdateData(FALSE);如果你希望知道用户在对话框中到底输入了什么,就应该在访问变量前调用UpdateData(TRUE),将控件的输入映射到变量中。

Invalidate():
     该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原来被遮住的部分就是无效的,需要重绘。这时Windows会在应用程序的消息队列中放置WM_PAINT消息。MFC为窗口类提供了WM_PAINT的消息处理函数OnPaint,OnPaint负责重绘窗口。视图类有一些例外,在视图类的OnPaint函数中调用了OnDraw函数,实际的重绘工作由OnDraw来完成。参数bErase为TRUE时,重绘区域内的背景 将被擦除,否则,背景将保持不变。

InvalidateRect():
    该函数的功能与Invalidate基本一样,不同的是,它是使指定的某个区域无效,需要输入一个区域。

UpdateWindow():
     UpdateWindow( )的作用是使窗口立即重绘。调用Invalidate等函数后窗口不会立即重绘,这是由于WM_PAINT消息的优先级很低,它需要等消息队列中的其它消息发送完后才能被处理。调用UpdateWindow函数可使WM_PAINT被直接发送到目标窗口,从而导致窗口立即重绘。

 


文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/3_program/c++/cppjs/20071111/85617.html

 

 

 

  1. Invalidate在消息队列中加入一条WM_PAINT消息,其无效区为整个客户区。
  2. UpdateWindow直接发送一个WM_PAINT消息,其无效区范围就是消息队列中WM_PAINT消息(最多只有一条)的无效区。
  3. 效果很明显,当调用Invalidate之后,屏幕不一定马上更新,因为WM_PAINT消息不一定在队列头部,而调用UpdateWindow会使WM_PAINT消息马上执行的,绕过了消息队列。
  4. 如果调用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和UpdateWindow的区别

Invalidate和UpdateWindow的区别 Invalidate在消息队列中加入一条WM_PAINT消息,其无效区为整个客户区。 UpdateWindow直接发送一个WM...

Invalidate、InvalidateRect、UpdateData、UpdateWindow的用法和区别

InvalidateRect()函数的作用是设置一个无效区域,并发送一个WM_PAINT消息到消息队列中,不过这个消息在众多的消息之中优先级比较级。 在VC++编程中,对无效区域的处理方式是: ...

Invalidate()与 UpdateWindow()的区别

Invalidate让客户区处于可以重画的状态,而UpdateWindow开始重画,但是它先判断客户区是否为空,不空UpdateWindow不执行,为空才执行重画。 Invalidate与Upda...

invalidate和updatewindow的区别

只将窗口显示区域标记为无效以产生WM_PAINT消息,对于某些应用程序来说也许不是完全令人满意的选择。在呼叫InvalidateRect之后,Windows将WM_PAINT消息放入消息队列中,最后由...

Invalidate、RedrawWindow与UpdateWindow的区别

原文地址::http://hi.baidu.com/aresial/item/1da770d995fc4936e2108fac   相关网帖   1.VC窗口刷新InvalidateRect和...

窗口刷新的几个函数:Invalidate UpdateWindow RedrawWindow

一:什么时候才会发生重绘窗口的消息?       当需要更新或重新绘制窗口的外观时,应用程序就会发送WM_PAINT消息。对窗口进行重新绘制。 二:Invalidate() -- Re...

MFC点点滴滴——Invalidate/InvalidateRect/UpdateWindow

一、Invalidate介绍   void Invalidate( BOOL bErase = TRUE );   该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘,例如,如果一个...
  • zhd320
  • zhd320
  • 2011-09-17 13:00
  • 1023

关于Invalidate、InvalidateRect和UpdateWindow

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

InvalidateRect,invalidate,updatewindow

InvalidateRect(HWND) 使窗口无效 产生消息WM_PAINT;  ValidateRect(HWND)使窗口有效 清除消息队列中的WM_PAINT消息 在编程的时候经常把Up...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)