GDI画图(一)Refresh&Invalidate

总结和开始记录实验的现象,调试代码的经验,同时开始用博客记录一些技术上的进步

2017-09-01

09:01:02

1、

  picturebox 上 进行覆盖,移动,大小改变,都会触发控件重绘事件,重绘其本身和其所有的子控件,

所以以绘图区域为父容器的pictureBox在程序运行时进行的任意操作只要是其visible = true 就会触发picturebox重绘;

 2、

  所有的技术更新完善应该在实验基本成功之后去做的,应该住很短的时间里打通设计的思路,确立该方案可行,而后加以技术完善,

在设计之初不应该被诸多细节绊住手脚,细节之处可以先放到一边,先把主干作重要的功能实现出来。

3、

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

Refresh: 强制控件使其工作区无效并立即重绘自己和任何子控件。== Invalidate Update

Invalidate: 使控件的特定区域(可以自己设置区域,从而提高性能)无效并向控件发送绘制消息。
                将控件标记为需要重绘,但是不会立即执行刷新重绘,等到系统空闲时进行重绘。


Update: 使控件重绘其工作区内的无效区域,立即调用Paint事件。若有无效区域,Update将立即触发重绘。

Paint: 无处不在。如果你调用3次Invalidate,但是系统将只触发一次Paint事件。

大多数时候Invalidate已经足够了,当系统要集中进行大量的刷新重绘时,建议使用Invalidate,因为这样系统最终只进行一次刷新,提高了系统性能。如果你想立即执行刷新的时候,建议使用Refresh方法。

Control.Refresh 方法


  • 强制控件使其工作区无效并立即重绘自己和任何子控件。

反编译源码:


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

 

Control.Invalidate 方法


  • 使控件的特定区域无效并向控件发送绘制消息。

 

 名称说明
公共方法 .NET Compact Framework 提供支持 Invalidate() 使控件的整个图面无效并导致重绘控件。
公共方法 Invalidate(Boolean) 使控件的特定区域无效并向控件发送绘制消息。还可以使分配给该控件的子控件无效。
公共方法 .NET Compact Framework 提供支持 Invalidate(Rectangle) 使控件的指定区域无效(将其添加到控件的更新区域,下次绘制操作时将重新绘制更新区域),并向控件发送绘制消息。
公共方法 Invalidate(Region) 使控件的指定区域无效(将其添加到控件的更新区域,下次绘制操作时将重新绘制更新区域),并向控件发送绘制消息。
公共方法 Invalidate(Rectangle, Boolean) 使控件的指定区域无效(将其添加到控件的更新区域,下次绘制操作时将重新绘制更新区域),并向控件发送绘制消息。还可以使分配给该控件的子控件无效。
公共方法 Invalidate(Region, Boolean) 使控件的指定区域无效(将其添加到控件的更新区域,下次绘制操作时将重新绘制更新区域),并向控件发送绘制消息。还可以使分配给该控件的子控件无效。

 

 备注

         调用 Invalidate 方法并不强制同步绘制;若要强制同步绘制,请在调用 Invalidate 方法之后调用 Update 方法。在不带参数的情况下调用此方法时,会将整个工作区添加到更新区域。

 

Control.Update 方法


  • 使控件重绘其工作区内的无效区域。

备注

         执行所有对绘制的挂起请求。

         有两种重新绘制窗体及其内容的方法:

  • 您可以将 Invalidate 方法的重载之一与 Update 方法一起使用。

  • 可以调用 Refresh 方法,此方法强制控件重新绘制其自身及其所有子级。这等效于将 Invalidate 方法设置为true 并将该方法与 Update 一起使用。

Invalidate 方法控制绘制或重新绘制的内容。Update 方法控制发生绘制或重新绘制的时间。如果将 Invalidate 和Update 方法一起使用,而不是调用 Refresh,则重新绘制的内容取决于您使用的 Invalidate 的重载。Update 方法仅仅是强制立即绘制控件,而 Invalidate 方法则控制当您调用 Update 方法时所绘制的内容。

 

示例代码:

 
private void button1_Click(object sender, EventArgs e)  
{  
    textBox1.Text = "XXX";  
  
    textBox1.Invalidate();  
  
    //textBox1.Update();  
    //textBox1.Refresh();  
  
    Thread.Sleep(3000);  
    textBox1.Text = "YYY";  
}  

 

        由于Thread.Sleep这一句的存在,虽然textBox1执行了Invalidate,但是并没有显示"XXX",而是在3秒钟之后直接显示了"YYY";

        如果去除Update或者Refresh的注释,才可以实现先显示"XXX",3秒钟之后再显示"YYY"。

        Control.Update 方法:使控件重绘其工作区内的无效区域。
        Control.Refresh 方法:强制控件使其工作区无效并立即重绘自己和任何子控件,等效于将 Invalidate 方法设置为 true 并将该方法与 Update 一起使用。

那么既然有了Update,为何还要存在Invalidate呢?
        原因是Invalidate有重载的版本例如:Invalidate(Rectangle, Boolean)   使控件的指定区域无效(将其添加到控件的更新区域,下次绘制操作时将重新绘制更新区域),并向控件发送绘制消息。还可以使分配给该控件的子控件无效。

        其实Invalidate 方法控制绘制或重新绘制的内容。Update 方法才是控制发生绘制或重新绘制的时间(即执行重绘制命名)。

posted @ 2017-09-01 10:56  Ecr_hool  阅读(1033)  评论(0编辑  收藏  举报