Head First C# 中文版 第13章 控件和图形 page605

来源:互联网 发布:围棋直播软件 编辑:程序博客网 时间:2024/06/06 12:34

 

仔细研究窗体和控件是如何重绘自己的


还记得早些时候我们说使用Graphics对象 就是自己控制图形绘制吧。这就好像告诉.NET“嘿,我知道自己做什么呢。我可以承担额外的责任。”在绘制和重绘的时候,有可能你不想在窗体最小化和最大化的时候重绘...或者你想要更频繁的重绘。一旦你了解了窗体和控件的幕后情景,你就可以自己掌握重绘了:


①每个窗体都有Paint事件


窗体需要重绘自己的时候,就会触发Paint事件。那么是谁负责触发事件呢?是一个叫做OnPaint的方法,该方法是窗体或者用户控件从Control类继承来的。去任意一个窗体中去,覆写OnPaint


 

拖动窗体--拖出屏幕,最小化,把它隐藏到其它窗口后面。仔细观察输出。任何时候窗体的一部分被弄花了或者失效了的时候,它就需要被重绘。ClipRectangle定义了窗体需要被重绘的部分。只重绘需要重绘的一部分,可以提高性能。


②需要重绘的时候,调用Invalidate(),并定义重绘的部分


在被遮挡的部分重新出现的时候,.NET触发Paint事件。它调用Invalidate()方法,并传递进去一个Rectangle。这个Rectangle定义了需要重绘哪部分。然后.NET调用OnPaint方法来告诉你的窗体触发一个Paint事件并重绘部分窗体。

 

Update()方法给你的Invalidate请求做高的优先级

 

你或许没有觉察到,窗体每时每刻都在接收消息。几乎所有以On开头的方法都是窗体需应答的消息。Update()方法把

 

Invalidate消息移动到消息队列中的最上方。

④窗体的Refresh()方法相当于Invalidate()加Update()

 

有一个捷径,就是Refresh()方法,它首先调用Invalidate()方法来让整个区域失效,然后调用Update()来使得消息移动到队列的顶端。