您的位置:首页 > 其它

读书笔记_GDI+程序设计_第七章(裁剪和失效)

2008-09-07 12:52 357 查看
裁剪区域:绘图表面中可以看到实际绘图操作效果的区域
有时,我们希望能在代码中显式控制裁剪区域,并使用代码指定要在绘图表面的哪一个区域绘图。
其它时候,当需要重新绘制部分或整个窗体时,架构需要控制裁剪区域

使用Graphics的SetClip方法,可以设置一个裁剪区域,该裁剪区域好似在一张纸上放了一个模板,使得模板中暴露出来的区域是可见的。

通过裁剪区域的设置,我们可以避免绘制整个窗口,以达到减小工作量的目的。

失效机制:
1. 应用程序中的某处代码确定窗口的内容或自定义控件是否需要修改。然后调用重载的Invalidate方法。如果我们调用了无参的重载方法,整个控件或窗口将失效。另一种方法是给Invalidate方法传递一个矩形或一个区域,然后该方法只使指定的区域失效。
2. 在调用Invalidate方法后的某个时刻,GDI+将发送一个Paint事件给窗口或自定义控件。我们不确定此Paint事件何时将被触发
3. 当Paint事件被触发后,GDI+设定裁剪区域为我们使之失效的区域。如果我们一次使几个矩形或区域失效,GDI+可以把这些区域合并为一个区域并只引发一个Paint事件。
4. Paint事件也许不会立即出现。如果失效操作后,我们继续进行处理,Paint事件将不会出现,直到我们放弃了窗体的控制。
此外,如果已经使一些窗口和控件失效,我们不能规定Paint事件被引发的顺序。
5. 如果想要为失效操作强制引发Paint事件,可以调用Form.Upate方法,它也继承了Control类。如果调用了Update方法,在Update方法返回调用它的方法之前将发生一个Paint事件。
6. 在很多情况下,伴随Paint事件出现的裁剪区域是与传递给Invalidate方法相同的矩形或区域,除非GDI+把多个失效操作合并为一个。
失效操作使用与裁剪相同的坐标系行为——因而失效操作以象素为单位而不是以子象素为单位。这并不奇怪,因为失效操作取决于裁剪的能力。

裁剪的技巧:
1. 把裁剪区域作为窗口状态的一部分存储——例如,存储在一个私有成员变量中,而不是Paint事件中。这使得任意的事件处理程序或辅助函数能够访问和修改裁剪区域。它还有助于今后的维护程序员识别裁剪算法。这项技术意味着我们将更倾向于只使用CombineMode枚举的Replace成员。
2. 当需要修改裁剪区域时,修改状态变量,然后在绘图之前显式的替换裁剪区域
3. 当您使用多种方法的绘图操作创建一个复杂控件时,在开始绘图前让每个方法设定它的裁剪区域(换句话说,不允许方法来假定存储在状态中的裁剪区域的值)。设定裁剪区域是一个廉价的操作,它只花费很少的处理时间。即使我们没有必要多次设定相同的裁剪区域,由此换来的简洁的代码也足以补偿处理时间上的微小增长。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: