在做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。

1 public void Invalidate()
2 {
3     this.Invalidate(false);
4 }

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

 1 public void Invalidate(bool invalidateChildren)
 2 {
 3     if (this.IsHandleCreated)
 4     {
 5     if (invalidateChildren)
 6     {
 7         SafeNativeMethods.RedrawWindow(new HandleRef(this.window, this.Handle), null, NativeMethods.NullHandleRef, 133);
 8     }
 9     else
10     {
11         using (new Control.MultithreadSafeCallScope())
12         {
13         SafeNativeMethods.InvalidateRect(new HandleRef(this.window, this.Handle), null, (this.controlStyle & ControlStyles.Opaque) != ControlStyles.Opaque);
14         }
15     }
16     this.NotifyInvalidate(this.ClientRectangle);
17     }
18 }

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

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

 1  /*
 2 * RedrawWindow() flags
 3 */
 4 #define RDW_INVALIDATE          0x0001
 5 #define RDW_INTERNALPAINT       0x0002
 6 #define RDW_ERASE               0x0004
 7
 8 #define RDW_VALIDATE            0x0008
 9 #define RDW_NOINTERNALPAINT     0x0010
10 #define RDW_NOERASE             0x0020
11
12 #define RDW_NOCHILDREN          0x0040
13 #define RDW_ALLCHILDREN         0x0080
14
15 #define RDW_UPDATENOW           0x0100
16 #define RDW_ERASENOW            0x0200
17
18 #define RDW_FRAME               0x0400
19 #define RDW_NOFRAME             0x0800

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

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

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

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

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

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

1 public virtual void Refresh()
2 {
3     this.Invalidate(true);
4     this.Update();
5 }

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

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

转载于:https://www.cnblogs.com/sjyforg/p/3300468.html

Invalidate,Update与Refresh的区别相关推荐

  1. Invalidate, Update, Repaint, Refresh的异同

    #Invalidate, Update, Repaint, Refresh的异同 文章目录 Invalidate Update Repaint Refresh Invalidate Invalidat ...

  2. 【Elastischearch】7.6 版本 update 后 refresh 慢,性能问题导致稳定性问题

    1.概述 7.6 版本 update 后 refresh 慢,性能问题导致稳定性问题 故障现象 主分片自我恢复非常慢,或者 refresh 慢.refresh 期间的堆栈: move 分片,或者重启节 ...

  3. 【impala】Impala中的invalidate metadata和refresh

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

  4. `git fetch` 和 `git remote update origin --prune` 的区别(以及跟`git pull` 的区别)

    git fetch 和 git remote update origin --prune 的区别 git fetch 拉取分支,远程被删除的分支不会同步删除本地origin的分支(origin/xxx ...

  5. Impala 中invalidate metadata和refresh

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

  6. 正确使用Impala的invalidate metadata与refresh语句

    在Impala中,invalidate metadata与refresh语句都可以用来刷新表,但它们本质上还是不同的.本文简要分析一下,并说明它们应该在什么情况下使用. Impala on Hive介 ...

  7. Update和FixedUpdate的区别

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

  8. session.invalidate()和session.removeAttribute()的区别

    1.理清概念 要明白这两个方法的区别,首先需要弄清楚这两个对象的概念. 1.1.关于session session是一种保存在服务端的,用于记录用户状态的对象. 用户状态可能有很多种,如登录用户名,登 ...

  9. SPListItem.Update() 与 SPListItem.SystemUpdate()区别

    大家在SharePoint开发方面都用过SPListItem.Update 方法,不过您可能没有用过SPListItem.SystemUpdate方法,现在来介绍一下这两个方法的区别: 先看一下SDK ...

最新文章

  1. refreshcontrol 实现下拉刷新的功能
  2. 文档相似度之词条相似度word2vec、及基于词袋模型计算sklearn实现和gensim
  3. Vue之element table 后端排序实现
  4. JDBC驱动的动态加载
  5. [css] 要是position跟display、overflow、float这些特性相互叠加后会怎么样?
  6. 马云卸任阿里巴巴集团董事:传承计划执行完毕,换个江湖见!
  7. java 项目拆分_java – 多模块项目什么时候应该拆分成单独的存储库树?
  8. iOS 2x 3x
  9. 济宁与华为企业云战略合作携手推进云计算产业发展
  10. 借助Sigar API获取操作系统信息
  11. Python列表推导式求素数
  12. 对比学习系列论文CPC(一)——CPC概览
  13. docker安装tomcat8
  14. 【AR】DroidCam笔记本调用手机摄像头(smartphone‘s camera as pc webcam)
  15. php query参数解析,php http_build_query()函数实例讲解
  16. Gson解析json数据
  17. 多线程(Thread的类的运用-Runnable类的使用/多线程的注意点)
  18. Unity 数学基础
  19. Python 区间库 interval
  20. 比尔盖茨宣布其将在两年后退休!!!

热门文章

  1. 在尝试重新安装一个服务时遇到这样的错误:指定服务已标记为删除
  2. 热议创新 众专家再谈 “中国企业如何创造”
  3. Oracle数据库基础知识(一)
  4. 数据结构(C++版) 栈的链接存储结构及实现
  5. 惠普微型计算机怎么装机,详解hp如何安装系统
  6. 参考文献如何居中_一线教师如何写教育教学论文?
  7. 浅谈jQuery Mobile设计思想
  8. Visual C# .Net 环境中编程实现浮动工具栏
  9. 三容水箱液位控制系统_光电液位传感器在饮水机中的应用解决方案
  10. E9启动后无法打印日志