3.缩放和字体
在继续介绍前,我们先探讨一些用非常小的缩放因子缩放文本的相关问题。如果没有合理地处理它,那么以较小缩放因子进行缩放的文本宽度将与其高度不成比例。图 17.16 显示了这个问题的效果,文本的宽度超出周围边框的范围。
即使字体太小而无法阅读,我们可能仍然希望显示单词、句子和段落的完整形状。这种需求一般应用于打印预览和Symbian操作系统的富文本视图,与我们的应用程序不同的是,即使在字体小于一个像素的情况下,它也可适当地处理并显示字体。并不是所有的智能手机视图都必须支持这一点。因此,对于许多手机来说,这并不是一个真正的问题。
从TFontSpec中获得CFont*时,同时从缇尺寸转换为像素尺寸,正如所预测的那样,像素不需要是正方形的,但字体的高度和宽度将按比例缩放。但是,在宽度小于一个像素的情况下,字符将不能显示,因为写一个字符的最小单位是一个像素,所以需要特殊的比例支持。
一种合理的解决方案是在将结果转换为以像素为单位显示之前,以缇为单位来计算整个字符串的宽度。如果每个像素有多于一个的字符,那么字符串长度无法以像素正确计算。
4.绘制文本
我们可以看到在DrawInRect()函数中如何使用已分配的字体。
该段代码中使用的 DrawText()函数指定了一个矩形,并且保证在该矩形中剪裁绘制。然而,如果设置了iFullRedraw,DrawText()将在绘制前产生一个白色背景。当iFullRedraw被设置,画刷设置将是实心的和白色的,这将会产生白色的背景;如果没有设置,实际上不存在画刷,并且在原先的背景上直接绘制文本,即 UI 框架绘制的对话框背景图像。在实际程序中,重绘背景是无条件执行的;根据应用程序、用户界面和特殊的手机的需要,应用程序总是使用框架绘制的图像,或者显式地绘制任何需要的背景。
5.使用视图
CExampleHelloControl具有用于绘制相关模型的CexampleHelloView。
首先,CExampleHelloControl绘制10个像素宽的环绕边框。确保该段代码的输出位于屏幕上,并且选择的10个像素宽的边框与缩放状态无关(如果边框根据缩放状态而进行缩放,看起来将很别扭)。
代码确保绘制每个像素:使用 DrawUtils::DrawBetweenRects()将包含文字的矩形和控件外部之间的区域变成白色。然后,使用画笔在边框的内部绘制一个矩形。接下来,该矩形将收缩1个像素,并且传递给Hello视图的绘制函数。
该示例所要表明的基本点是:可以实现完全与控件和屏幕设备无关的绘制代码。
【责任编辑:
董书 TEL:(010)68476606】