Invalidate,Update与Refresh有什么区别

在做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分别代表了是否需要在重绘的时候,同时重绘所有的子窗体。

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

本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/net/

如需要重绘所有子窗体,则调用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方法。

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。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索方法
, this
, define
, public
, invalid
, invalidate
, void
重绘窗口
refresh update、freq refresh 区别、invalidate、session.invalidate、android invalidate,以便于您获取更多的相关知识。

时间: 2024-09-28 22:58:43

Invalidate,Update与Refresh有什么区别的相关文章

android中Invalidate和postInvalidate的更新view区别_Android

Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用. Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用. Android程序中可以使用的界面刷新方法有两种,分别是利用invalidate和利用postInvalidate()来

android中Invalidate和postInvalidate的更新view区别

Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用. Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用. Android程序中可以使用的界面刷新方法有两种,分别是利用invalidate和利用postInvalidate()来

hibernate学习笔记(三)

hibernate的一些杂记:1.sessionFactory的用法:SessionFactory是线程安全的,构造 SessionFactory 很消耗资源sessionFactory = new Configuration().configure().addClass(**).addClass(**).buildSessionFactory();Session session = sessionFactory.openSession();在这里addClass的好处是不需要在hibernat

实现Android和PC之间的蓝牙通信

   这两天想实现PC和安卓手机的通信,限于水平,知道的方法大概有两种:基于数据包的socket和蓝牙.虽然看起来简单,但调也调了两天多.自己测试了下socket,在室内WIFI环境下时延大概是0.1s.而在3G网络下时延居然达3s之多,而且只要不发数据,端口貌似就会断掉,总之,很不爽.于是,便考虑了蓝牙的方法. 实现手机和PC的蓝牙通信,一种是最常用的蓝牙虚拟串口,这种方法可以通过配置非常简单地实现,很多外置蓝牙GPS都用这种做法.但大名鼎鼎的安卓却不支持,因此对大部分外置GPS都不提供支持(

在C#中使用.NET SDK创建控制

创建|控制 在C#中使用.NET SDK创建控制作者: Norm Almond 下载示例工程 - 8 Kb 介绍在这篇教程中,我将使用.NET架构创建一个简单的时钟控制示例,这个控制是一个显示当前时间的时钟,我将指导读者实现秒针并显示钟点数.文章加亮处是创建这个控制的关键点,读者可以参考其中的代码.创建一个控制的最快的方法是从这里拷贝一个控制示例代码: ..\Program Files\NGWSSDK\Samples\QuickStart\winforms\samples\Cs\WritingC

异常:org.springframework.orm.hibernate3.HibernateJdbcException

.springframework.orm.hibernate3.HibernateJdbcException: JDBC exception on Hibernate data access: SQLException for SQL [insert into tb_news (n_title, n_content, n_style, n_addTime, n_addAdmin, n_isPublish, n_publishTime, n_publishAdmin, n_updateTime,

作为一个新手的Oracle(DBA)学习笔记

Oracle数据库笔记 Jack Chaing 作者QQ595696297 交流群 127591054 祝大家学习进步. 如果大家想看Word版本的可以去下载:Word排版比较清晰一些. http://download.csdn.net/detail/jack__chiang/9810532 此笔记是作者本人去年开始从一个DBA新人的学习笔记,积累至今,希望拿出来给那些对DBA有兴趣的童孩学习,大家一起努力嘛. 此笔记记录了作者工作学习中从零基础的学习的记录,和从中遇见的问题与问题的解决!很高兴

iOS 开发中的 Flux 架构模式

本文讲的是iOS 开发中的 Flux 架构模式, 在半年前,我开始在 PlanGrid iOS 应用程序中采用 Flux 架构(开发).这篇文章将会讨论我们从传统的 MVC 转换到Flux的动机,同时分享我们目前积累到的经验. 我尝试通过讨论代码来描述我们大部分的 Flux 实现, 它用于我们今天的产品中. 如果你只对综合结果感兴趣, 请跳过这篇文章的中间部分. 为什么从 MVC 转移 为了引入我们的决定, 我想要先谈一谈 PlanGrid 这个应用遇到的一些挑战.一些问题仅针对企业级应用程序,

2008PGCON PostgreSQL/Materialized Views

Introduction Materialized views are certainly possible in PostgreSQL. Because of PostgreSQL's powerful PL/pgSQL language, and the functional trigger system, materialized views are somewhat easy to implement. I will examine several methods of implemen