MFC中Invalidate(); 和UpdateWindow();的用法

原创 2014年03月09日 19:54:18

1.

Invalidate()是强制系统进行重画,但是不一定就马上进行重画。因为Invalidate()只是通知系统,此 时的窗口已经变为无效。强制系统调用WM_PAINT,而这个消息只是Post就是将该消息放入消息队列。当执行到WM_PAINT消息时才会对敞口进行重绘;
UpdateWindow只向窗体发送WM_PAINT消息,在发送之前判断GetUpdateRect(hWnd,NULL,TRUE)看有无可绘制的客户区域,如果没有,则不发送WM_PAINT;
当调用Invalidate之后,屏幕不一定马上更新,因为WM_PAINT消息不一定在队列头部,而调用UpdateWindow会使WM_PAINT消息马上执行的,绕过了消息队列;
如果调用Invalidate之后想马上更新屏幕,那就加上UpdateWindow()这条语句


2.

和楼上差不多:Invalidate()使窗口客户区无效,并向消息队列中寄送一个WM_PAINT消息,假如此时消息队列中没有要处理的其他消息,则此时窗口立即会重绘(因为WM_PAINT会立即得到处理),如果消息队列中有其他消息,那么WM_PAINT就排队等呗。。。。这样就可能会存在一个不能即时刷新窗口的问题;
UpdateWindow()绕过消息队列(不进队),直接向窗口客户区发送WM_PAINT消息,使得窗口立即更新。


3.

单独的Invalidate(); 在窗口要重绘时用
和Invalidate();UpdateWindow();通常在程序开始时用



4.要注意UpdateWindow()和 UpdateData()的区别

UpdateData()一般是更新编辑框中的数据,

UpdateWindow()是更新整个窗口。

MFC中屏幕刷新闪烁问题解决方法总结

在MFC中经常遇到屏幕刷新的问题,下面是几种解决方法。 1,刷新整个程序区域,有明显的闪烁情况     Invalidate( TRUE );     UpdateWindow();  ...
  • longzaitianya1989
  • longzaitianya1989
  • 2014年01月14日 16:54
  • 10947

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

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

MFC中,如何获得对话框控件相对于父窗口(对话框窗口)的位置 及Invalidate(TRUE)的闪屏问题

在MFC中,如何获得对话框控件相对于父窗口(对话框窗口)的位置: CRect r; pWnd->GetWindowRect(&r); 这样获得的r是控件相对于屏幕的坐标,然后用ScreenToC...
  • erick08
  • erick08
  • 2013年03月24日 15:17
  • 1896

MFC中ListControl控件的使用

以下未经说明,listctrl默认view 风格为report 1. CListCtrl 风格 LVS_ICON: 为每个item显示大图标 LVS_SMALLICON: 为每个item...
  • wang15061955806
  • wang15061955806
  • 2016年10月08日 15:14
  • 1490

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

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

从Invalidate();方法理解windows消息机制

Invalidate标记一个需要重绘的无效区域,并不意味着调用该函数后就立刻进行重绘。类似于PostMessage(WMPAINT),需要处理到WMPAINT消 息时才真正重绘。因为Invalida...
  • ghevinn
  • ghevinn
  • 2014年04月09日 17:46
  • 3196

View的两种更新方法-从源码角度分析invalidate()和postInvalidate()的区别

介绍最近在看各种Android多线程开发的各种知识,网上看到有关线程和View的东西,其中View的两种更新方法invalidate()和postInvalidate()。记得当时在深圳去面试其中有个...
  • Card361401376
  • Card361401376
  • 2016年05月24日 01:15
  • 1701

从源码看invalidate和requestLayout的区别

从源码看invalidate和requestLayout的区别invalidate和requestLayout经常被用来刷新界面,有的时候2个一起用,TextView的源码里也经常看到2者一起用的情况...
  • litefish
  • litefish
  • 2016年10月19日 14:46
  • 3399

自定义控件invalidate()方法未成功调用onDraw()

写过自定义控件的大家都知道invalidate方法是Android请求重绘的方法。所以会调用到我们自己重写的onDraw方法。 但是在我最近写的一个控件时却没有调用他的onDraw方法。我所重写的控...
  • qq_28497681
  • qq_28497681
  • 2015年12月15日 13:25
  • 2396

Impala实践之九:invalidate metadata详细使用方法说明

前言Impala一直是我们各个业务使用的重点,但是在Impala的使用上感觉一直不是很成熟,比如说 invalidate metadata操作,到底什么时候该使用-r参数,什么时候不使用,什么时候可以...
  • zhaodedong
  • zhaodedong
  • 2016年08月19日 15:41
  • 1047
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC中Invalidate(); 和UpdateWindow();的用法
举报原因:
原因补充:

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