博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Invalidate,Update与Refresh的区别
阅读量:5136 次
发布时间:2019-06-13

本文共 2540 字,大约阅读时间需要 8 分钟。

在做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     else10     {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     0x001010 #define RDW_NOERASE             0x002011  12 #define RDW_NOCHILDREN          0x004013 #define RDW_ALLCHILDREN         0x008014  15 #define RDW_UPDATENOW           0x010016 #define RDW_ERASENOW            0x020017  18 #define RDW_FRAME               0x040019 #define RDW_NOFRAME             0x0800

 

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

 

而如果不需要重绘子窗体的话,相应调用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

你可能感兴趣的文章
DjangoORM相关(单表操作)
查看>>
分享一个生成反遗忘复习计划的java程序
查看>>
公共开发中js代码的管理
查看>>
SpringMVC(九):SpringMVC 处理输出模型数据之ModelAndView
查看>>
Modal模态框3秒后自动关闭
查看>>
CSS 样式书写规范
查看>>
对Date的扩展,将 Date 转化为指定格式的String
查看>>
tc: 模拟网络异常的工具
查看>>
asp.net利用Ajax和Jquery在前台向后台传参数并返回值
查看>>
Java调优之JVM和线程的内存分析
查看>>
Windows7下zip安装mysql
查看>>
Android应用程序文件缓存getCacheDir()和getExternalCacheDir()
查看>>
spring事务失效
查看>>
线段树入门( 转 )
查看>>
浅谈 JSON.stringify 方法
查看>>
不同手机根据坐标计算控件、图片的像素,px 与 dp, sp换算公式?
查看>>
XML深度解析
查看>>
根据一个整齐的数据,随机的得到一个新的数组,可指定数组元素出现的位置
查看>>
转载 JS获取当前手机浏览器可视区域大小
查看>>
操作系统学习---内存管理
查看>>