设为首页 加入收藏

TOP

17.9.3 与设备无关的绘制(2)
2013-10-07 01:06:29 来源: 作者: 【 】 浏览:67
Tags:17.9.3 设备 无关 绘制

2.获得字体

这里需要使用12磅的SwissA粗体文本来绘制相关消息。“12磅的SwissA粗体”是一种与设备无关的指定字体的方式。我们所需要做的是,获得符合该规范的、与设备相关的字体,并且考虑具体的缩放状态。 Symbian操作系统使用下面的类来支持各种字体(见图17.15)。

TFontSpec:与设备无关的字体规范,支持名称、字高和样式(包括斜体、粗体以及上标/下标等属性)。

CFont:通过 CFont *的形式访问的与设备相关的字体。大多数 CFont 函数,例如AscentInPixel(),提供快速访问任意字符或特殊字符串的像素尺寸。

我们可以使用 DrawInRect()函数中与尺寸和目标无关的剩余代码分配(并释放)字体。然而,DrawInRect()不是一个异常函数,并且也不应该是异常退出函数,因为是从 Hello 控件的 Draw()函数中调用它,而字体分配可能会失败,也可能会异常退出。使用捕获机制可以解决上述问题。但我们并没有这样做,因为它的实用性不强,并且在绘制时分配资源也是一种不良做法,这样做会使相关代码不适合于大规模的应用。因此,在CExampleHelloControl::SetZoomAndDevice DepedentFontL()中分配和释放字体。这是进行字体分配的一个合适位置,因为它在类构造中调用该方法,而且可以作为缩放结果:当用户放大或缩小时(不会在其他时刻),与尺寸相关的字体可以随之变动。

下面是相关代码:

 

这里关键函数是 GetNearestFontInTwips(),该函数是 MGraphicsDeviceMap()的成员函数。将TFontSpec 传递给该函数,可以返回一个指向设备相关字体的指针(CFont*)。从 TFontSpec 到CFont*的映射最终由图形设备进行处理(虽然字体规范可能通过缩放因子进行缩放)。拥有CFont*后,就只能在分配该CFont*的设备上使用它—更准确地说,只能通过分配它的设备的图形上下文来使用它绘制。该函数通常查找一个匹配,如果没有找到相应的匹配,该函数将返回一个错误代码。通过调用User::LeaveIfError()来传播任何发生的错误。

注意,使用字体后需要释放该字体;当不再需要一个CFont*时,必须请求设备释放它。如果忘记释放字体,其影响等同于内存泄漏:程序将从仿真器调试版本中发生严重错误并退出。还没有分配字体时,调用 ReleaseFont()将不会产生任何错误,该函数将正常返回。因此,可以安全地在函数开始时释放字体。最后分配的字体将在Hello控件类的析构函数中进行释放。 代码分配NULL给iFont,因为该函数可能在分配字体前异常退出。在这种情况下,如果iFont没有被设置为NULL,析构函数将尝试再次释放字体,从而造成应用程序崩溃。

字体规范使用TFontSpec类,由gdi.h头文件中的GDI定义。下面是该类的声明:

 

字体规范由字型、字高和字体样式组成。TTypeface 类也由 GDI 定义,它具有一些属性,其中最重要的是名称(name)属性。 使用GetNearestFontInTwips()时,需要以缇指定字高,虽然一些设备支持GetNearestFontInPixels()函数,该函数允许以像素指定字高。

字体样式包括字形(posture)(竖直或斜体)、笔画粗细(stroke weight)(粗体或普通)和打印位置(print position)(普通、上标、下标)。

其他的字体属性,例如下划线和删除线,根本不是字体属性——它们属于图形效果,可以使用CGraphicsContext函数应用这些效果。

TFontSpec有一个构造函数,用来在单条语句中来指定字体。TFontSpec也有默认的构造函数和赋值运算符。最后,TFontSpec 还有 ExternalizeL()和 InternalizeL()函数。这些函数非常重要:例如,富文本对象必须能够在存储时外部化TFontSpec对象,并在恢复时重新内部化TFontSpec。TFontSpec对象可以存储在富文本对象中(比如,某种类型的文档)。它们提供如何在屏幕或打印机上显示文档的所必需的信息。无论是保存富文本对象或者从文件中进行恢复,都需要使用TFontSpec 类。对于可以通过多种尺寸显示文本或在多个目标上显示文本的任何应用程序,TFontSpec类都可以发挥作用。

【责任编辑:董书 TEL:(010)68476606】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇17.9.3 与设备无关的绘制(3) 下一篇17.9.3 与设备无关的绘制(1)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: