17.9.3 与设备无关的绘制
这一节将介绍 CExampleHelloView 类中与设备无关的绘制代码,以及 CExampleHelloControl类中少量与设备无关的代码,这些代码用于分配适当的字体。然后,我们也将看到 CExample HelloControl类如何使用绘制代码。
首先,注意到CExampleHelloView从CBase中派生而来,而不是从CCoeControl派生而来。所有CCoeControl派生而来的类都是与设备相关的,因为相关的控件将与屏幕紧密联系在一起。
绘制代码位于 DrawInRect()函数中,该函数以设备映射、图形上下文和在其中进行绘制的矩形作为参数。DrawInRect()函数可分为两个部分:绘制文本和在文本周围绘制边框。
1.绘制边框 从绘制方框的部分代码入手,下面的代码绘制一个方框,该方框具有与设备无关的尺寸。该方框具有2个像素宽,内边为黑灰色,外边为黑色。
所有图形上下文绘制函数都被指定为以像素为单位。因此,在绘制矩形之前,必须转换尺寸,将原先指定的以缇为单位的尺寸改为以像素为单位。使用图形设备映射的缇到像素转换函数来实现这一点。记住,aMap最终将使用屏幕设备,这就是可以获得缇所对应的像素数量信息的方式。
于是产生了这样一个问题:我们无法确保矩形是否确实完全包含在 aDeviceRect 中,而且,不应该在aDeviceRect外部绘制。在屏幕或其他设备上,都无法保证绘图被剪裁到aDeviceRect。因为现在需要保证这一点,所以显式地设置了一个剪裁矩形。
即使是与设备无关的绘制代码,也必须考虑设备的实际情况。
我们将以不同的方法来考虑设备的实际情况:虽然开始以缇为单位来计算环绕矩形的尺寸,但以像素为单位来进行显式扩充。无论所绘图形显示什么内容,都希望它包括一条2个像素的边框—间隔一定缇数的 2 条直线,在缩小的状态下,这 2 条直线将重叠;而在放大状态下,这 2条直线将有一定的间隔。
【责任编辑:
董书 TEL:(010)68476606】