CExampleAppView和CExampleHelloControl都是控件,它们都从CCoeControl中派生而来。这一类控件是屏幕设备特有的控件,因此不能实现与目标无关的绘图代码。该示例将与目标无关的绘图代码分离到一个单独的类 CExampleHelloView 中,该类并不是控件。CExampleHelloView具有使用图形上下文(CGraphicsContext)的绘制函数和访问图形设备缩放函数的图形设备映射(MGraphicsDeviceMap)。使用CExampleHelloView类将与尺寸和目标无关的代码分离到一个独立的单元中。这就允许重用与尺寸无关的代码,将图形输出到打印机上。
然而,CExampleHelloControl也包含部分与尺寸和目标无关的代码:它使用独立的字体规范来分配执行绘制时所用的尺寸和与设备相关的字体。
下面总结了每个GDI类的角色(见图17.15)。
|
(1)CGraphicsContext 图形设备CGraphics Device创建的抽象基类。该类包含主要的绘制函数,并且提供在相关设备上绘制的“上下文”,其中包括用于绘制的画笔和画刷设置(例如色彩和线型)以及字体设置(例如粗体、下划线、斜体),同时也包括剪裁区域(可视绘制区)。该类也处理设备相关尺寸的像素,并且使用具有与设备相关的尺寸和表征的字体。因此,传递给 CGraphicsContext函数的尺寸和字体需要预先从与尺寸无关的单元转换到与尺寸相关的单元中。MGraphicsDeviceMap的派生类可实现这一点,这个派生类可能是 TZoomFactor 或 CGraphicsDevice。第 16 章中已经详细介绍了 CGraphicsContext,而本章的后面将介绍该类处理色彩和位图的方法。
(2)MGraphicsDeviceMap 该类是图形设备和缩放因子的抽象基类,它定义图形设备中与尺寸相关的函数。这些函数在像素(pixel)和缇(twip)之间转换,并且执行字体分配与释放。字体分配涉及查找相关设备所支持的字体,这些字体最接近于与设备无关的字体规范。
(3)CGraphicsDevice 所有绘制所用介质的图形设备的抽象基类。该类创建适合于将图形输出到自身的图形上下文(使用CreateContext()),其中包括设备的属性,例如尺寸和显示模式。该类分配(并释放)适合于将图形输出到自身的字体,并且在像素和缇之间进行转换。重要的图形设备是CScreenDevice、CBitmapDevice和CPrinterDevice(本章的后面将讨论位图应用)。
(4)TZoomFactor 定义缩放因子,并且实现 MGraphicsDeviceMap 接口。它分配和释放与设备相关的字体,并且在像素和缇之间进行转换。该类有助于进行缩放,因为它允许图形尺寸与目标尺寸无关。该类是递归的,因为 TZoomFactor对象可使用 MGraphicsDevice-Map,而它可能就是 TZoomFactor 自身。这就允许某个缩放因子对象包含另一个缩放因子对象,从而叠加子缩放因子产生的效果。顶层缩放因子必须使用 CGraphicsDevice(而不是另一个TZoomFactor)。
在示例应用程序中,缩放因子使用屏幕设备。在控件的构造函数中的设置如下:
- iZoomFactor.SetGraphicsDeviceMap(iCoeEnv->ScreenDevice());
iZoomFactor用于获得绘制所用的、与尺寸和设备相关的字体和尺寸。
| 回书目 上一节 下一节 |
