Invalidate函数的总结 - 也是界面刷新的总结(转载)

原创 2005年04月29日 13:22:00

InvalidateRect只是增加重绘区域,在下次WM_PAINT的时候才生效

InvalidateRect函数中的参数TRUE表示系统会在你画之前用背景色将所选区域覆盖一次,默认背景色为白色,可以通过设置BRUSH来改变背景色。

Invalidate()之后:
...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时,导入方向则相反。

Invalidate函数的总结 - 也是界面刷新的总结(转载)

http://blog.csdn.net/suya/archive/2005/04/29/367864.aspx 
  • jijibean
  • jijibean
  • 2008年04月23日 13:05
  • 120

刷新界面:invalidate()和postInvalidate() 的区别及使用

Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中...
  • dsa63
  • dsa63
  • 2014年09月17日 09:51
  • 1551

调用Invalidate后,屏幕没有马上刷新。。。

Invalidate让客户区处于可以重画的状态,而UpdateWindow开始重画,但是它先判断客户区是否为空,不空UpdateWindow不执行,为空才执行重画。 Invalidate与Upda...
  • nolatin
  • nolatin
  • 2014年02月16日 12:04
  • 4745

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

其中引用了下篇文章:http://topic.csdn.net/u/20081202/09/6612652d-be28-4042-8269-0f3b87c03f8e.html 一:什么时候才会发生重绘...
  • woyaowenzi
  • woyaowenzi
  • 2009年09月28日 14:20
  • 7975

Android界面刷新—— invalidate与postInvalidate

Android的invalidate与postInvalidate都是用来刷新界面的,用法区别在于:   1)invalidate():实例化一个Handler对象,并重写handleMessage方...
  • a2012s
  • a2012s
  • 2014年03月13日 09:44
  • 3585

关于Android调用invalidate()之后不能及时调用ondraw()的解决办法

关于invalidate的解释:当调用线程处于空闲状态时,会调用onDraw,刷新界面,也就是说,该函数仅是标记当前界面过期,并不直接负责刷新界面;这样的结果就是没能及时的刷新界面,导致出现的效果不是...
  • yyy2567338788
  • yyy2567338788
  • 2016年04月18日 18:57
  • 2820

Invalidate函数的总结

InvalidateRect只是增加重绘区域,在下次WM_PAINT的时候才生效 InvalidateRect函数中的参数TRUE表示系统会在你画之前用背景色将所选区域覆盖一次,默认背景色为白色,可以...
  • shuizhilan
  • shuizhilan
  • 2010年09月08日 10:00
  • 267

Invalidate函数的总结

 Invalidate函数的总结 InvalidateRect只是增加重绘区域,在下次WM_PAINT的时候才生效 ...
  • bingwen0210
  • bingwen0210
  • 2007年05月21日 01:29
  • 1491

不要在OnPaint()中使用Invalidate()来刷新窗口

我从CEdit类派生了一个子类CMyEidt,然后在CMyEidt::中绘图,并使用了Invalidate()来使编辑框进行重绘。但却导致CPU的占用率很高,并且,如何没有采用双缓冲机制,图片还会不停...
  • lp310018931
  • lp310018931
  • 2013年12月23日 00:38
  • 3345

界面的设计总结

  界面设计总结    在Intellij IDEA 环境中写的。 图形界面程序设计过程: 登录界面选用了菜单来实现; 首先,登陆界面。 只有简单的一张图片和欢迎的标题。   有...
  • xieshiyi7
  • xieshiyi7
  • 2015年10月08日 20:45
  • 912
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Invalidate函数的总结 - 也是界面刷新的总结(转载)
举报原因:
原因补充:

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