读书笔记_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. 当您使用多种方法的绘图操作创建一个复杂控件时,在开始绘图前让每个方法设定它的裁剪区域(换句话说,不允许方法来假定存储在状态中的裁剪区域的值)。设定裁剪区域是一个廉价的操作,它只花费很少的处理时间。即使我们没有必要多次设定相同的裁剪区域,由此换来的简洁的代码也足以补偿处理时间上的微小增长。
有时,我们希望能在代码中显式控制裁剪区域,并使用代码指定要在绘图表面的哪一个区域绘图。
其它时候,当需要重新绘制部分或整个窗体时,架构需要控制裁剪区域
使用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. 当您使用多种方法的绘图操作创建一个复杂控件时,在开始绘图前让每个方法设定它的裁剪区域(换句话说,不允许方法来假定存储在状态中的裁剪区域的值)。设定裁剪区域是一个廉价的操作,它只花费很少的处理时间。即使我们没有必要多次设定相同的裁剪区域,由此换来的简洁的代码也足以补偿处理时间上的微小增长。
相关文章推荐
- 读书笔记_GDI+程序设计_第五章(图像)(上)
- JavaScript高级程序设计(第3版)第七章读书笔记
- 『C程序设计』读书笔记系列文章之第七章 函数
- 读书笔记_GDI+程序设计_第五章(图像)(下)
- 读书笔记_GDI+程序设计_第六章(GraphicsPaths和Regions)
- 读书笔记_GDI+程序设计_第八章(变换)
- 读书笔记 - js高级程序设计 - 第七章 函数表达式
- 读书笔记_GDI+程序设计_第十三章(滚动)
- 读书笔记_GDI+程序设计_第二章(绘图表面)
- 读书笔记_GDI+程序设计_第十四章(鼠标事件和指针)
- 读书笔记_GDI+程序设计_第三章(钢笔和笔刷)
- 读书笔记_GDI+程序设计_第四章(文本和字体)
- 《C++ Primer》读书笔记——第七章
- .net 框架程序设计 读书笔记(一)---.net 平台构成
- 『C程序设计』读书笔记系列文章之第十章 结构体与共用体
- windows程序设计-第五版--读书笔记(2)--宽字符集和Unicode--文中内容摘取
- 《深入理解计算机系统》读书笔记——第七章 链接
- Javascript高级程序设计 第七章 --- 函数表达式
- 读书笔记——多核程序设计技术
- lua程序设计第二版 读书笔记(5-8章)