在做Windows Forms开发的时候,免不了需要手动刷新窗口,以重绘所需更改的控件,或其它什么的。当出现这类需求时,你有三个选择,使用Invalidate,Update或者Refresh方法。

Invalidate有六个重载方法:

public void Invalidate(Region region)
public void Invalidate(Region region, bool invalidateChildren)
public void Invalidate()
public void Invalidate(bool invalidateChildren)
public void Invalidate(Rectangle rc)
public void Invalidate(Rectangle rc, bool invalidateChildren)

一般而言,public void Invalidate()方法被使用的机会比较多。而在此方法内部其实又调了public void Invalidate(bool invalidateChildren)方法,并将参数设为了false。

 public void Invalidate()
{
this.Invalidate(false);
}

public void Invalidate(bool invalidateChildren)方法中参数值的true与false分别代表了是否需要在重绘的时候,同时重绘所有的子窗体。

 public void Invalidate(bool invalidateChildren)
{
if (this.IsHandleCreated)
{
if (invalidateChildren)
{
SafeNativeMethods.RedrawWindow(new HandleRef(this.window, this.Handle), null, NativeMethods.NullHandleRef, );
}
else
{
using (new Control.MultithreadSafeCallScope())
{
SafeNativeMethods.InvalidateRect(new HandleRef(this.window, this.Handle), null, (this.controlStyle & ControlStyles.Opaque) != ControlStyles.Opaque);
}
}
this.NotifyInvalidate(this.ClientRectangle);
}
}

如需要重绘所有子窗体,则调用RedrawWindow方法,参数flags设置为133。

flags是定义在WinUser.h文件中的一些宏定义。

  /*
* RedrawWindow() flags
*/
#define RDW_INVALIDATE 0x0001
#define RDW_INTERNALPAINT 0x0002
#define RDW_ERASE 0x0004 #define RDW_VALIDATE 0x0008
#define RDW_NOINTERNALPAINT 0x0010
#define RDW_NOERASE 0x0020 #define RDW_NOCHILDREN 0x0040
#define RDW_ALLCHILDREN 0x0080 #define RDW_UPDATENOW 0x0100
#define RDW_ERASENOW 0x0200 #define RDW_FRAME 0x0400
#define RDW_NOFRAME 0x0800

133就表示RDW_INVALIDATE|RDW_ERASE|RDW_ALLCHILDREN,各值的具体含义可以查看MSDN

而如果不需要重绘子窗体的话,相应调用InvalidateRect方法就可以了。

至于Update方法则直接调用UpdateWindow方法。

 public void Update()
{
SafeNativeMethods.UpdateWindow(new HandleRef(this.window, this.InternalHandle));
}

UpdateWindow可以绕开应用程序消息队列(应用程序中可能会有许多消息需要被处理),直接将WM_PAINT消息发送给窗体过程 (window procedure),但如果更新区域为空白的场合下,是不会发送任何消息的。Update方法其实是将Invalidate方法的优先级提升为最高。

最后是Refresh方法。从字义上可能会和Update相混淆,但是一旦看到了源代码,一切关系又变得很明白了。

 public virtual void Refresh()
{
this.Invalidate(true);
this.Update();
}

没错,Refresh先调用了Invalidate方法,接着又调用了Update方法。所以Refresh = Invalidate + Update。

原文同步发布于我的个人博客

Invalidate,Update与Refresh的区别的更多相关文章

  1. C# WinForm窗体 控件Control 的 Invalidate、Update、Refresh的区别

    Control.Refresh - does an Control.Invalidate followed by Control.Update.Refresh: 强制控件使其工作区无效并立即重绘自己和 ...

  2. c# Invalidate() Update() Refresh()的区别

    Control.Invalidate方法:使控件的特定区域无效并向控件发送绘制消息. 通常情况下,用Invalidate()使区域无效就可触发该控件的重画了,但在一些条件下却没有触发重画.例如: pr ...

  3. Unity3D中Update和Lateupdate的区别

    Unity中Update和Lateupdate的区别.Lateupdate和Update每一祯都被执行,但是执行顺序不一样,先执行Updatee然后执行lateUpdate. 如果你有两个脚本JS1. ...

  4. 【转】 Update和FixedUpdate的区别

    MonoBehaviour.Update 更新 当MonoBehaviour启用时,其Update在每一帧被调用. MonoBehaviour.FixedUpdate 固定更新 当MonoBehavi ...

  5. Unity3D中的Update, FixedUpdate, LateUpdate的区别

    MonoBehaviour.Update 更新 当MonoBehaviour启用时,其Update在每一帧被调用. MonoBehaviour.FixedUpdate 固定更新 当MonoBehavi ...

  6. 【转】Impala 中的 Invalidate Metadata 和 Refresh

    前言Impala采用了比较奇葩的多个impalad同时提供服务的方式,并且它会由catalogd缓存全部元数据,再通过statestored完成每一次的元数据的更新到impalad节点上,Impala ...

  7. Impala 中invalidate metadata和refresh

    首先了解一下:Impala如何融入Hadoop生态系统 Impala使用了Hadoop生态系统中许多熟悉的组件.Impala可以作为消费者和生产者与其他Hadoop组件交换数据,因此它可以以灵活的方式 ...

  8. Qt 中update()和repaint()的区别

    void QWidget::repaint ( int x, int y, int w, int h, bool erase = TRUE ) [槽]通过立即调用paintEvent()来直接重新绘制 ...

  9. QT update和repaint的区别

    void QWidget::repaint ( int x, int y, int w, int h, bool erase = TRUE ) [槽] 通过立即调用paintEvent()来直接重新绘 ...

随机推荐

  1. 第三章 springboot + jedisCluster(转载)

    本编博客转发自:http://www.cnblogs.com/java-zhao/p/5347703.html 如果使用的是redis2.x,在项目中使用客户端分片(Shard)机制. 如果使用的是r ...

  2. 终端 git log 修改样式

    git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d ...

  3. spring mvc(2):请求地址映射(@RequestMapping)

    @RequestMapping 参数说明 value定义处理方法的请求的 URL 地址.method定义处理方法的 http method 类型,如 GET.POST 等.params定义请求的 UR ...

  4. ADV数字的剪切

    #include <iostream> using namespace std; #define SIZE 9 #define MAXLEN 6 int data[SIZE][MAXLEN ...

  5. WEB前端开发人员须知的常见浏览器兼容问题及解决技巧

    所谓的浏览器兼容性问题,是指因为不同的浏览器对同一段代码有不同的解析,造成页面显示效果不统一的情况.在大多数情况下,我们的需求是,无论用户用什么浏览器来查看我们的网站或者登陆我们的系统,都应该是统一的 ...

  6. 找出一个二维数组中的"鞍点",即该位置上的元素在该行中最大,在该列中最小(也可能没有"鞍点"),打印有关信息.(提示:注意特殊情况:没鞍点或多个鞍点)

    #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { ][] = {}; ;i < ...

  7. Spring JdbcTemplate 调用存储过程

    遇到调用存储过程的业务,以前有用过,但不是用Spring的 JdbcTemplate去做的,这次是在一个已经有的SpringMVC框架的项目下写处理存储过程的. 参考网络中的方法,在实际操作中遇到两个 ...

  8. DBCP配置数据库连接乱码问题

    driverClassName = com.mysql.jdbc.Driver url = jdbc:mysql:///bigdata username = root password = 82371 ...

  9. oracle DBMS_LOCK.SLEEP()的使用

    create or replace procedure times isii positive:=1;beginloop dbms_lock.sleep(1);dbms_output.put_line ...

  10. XAF ObjectSpace保存时添加记录

    点击保存按钮时自动添加相关记录(用于界面查看),另外还有Audit控件可使用,此处只是一个简单的功能. 新建一个VC并关联到相关的View,代码如下: public partial class Gon ...