设为首页 加入收藏

TOP

17.9.4 深入介绍GDI(1)
2013-10-07 01:06:08 来源: 作者: 【 】 浏览:68
Tags:17.9.4 深入 介绍 GDI

17.9.4  深入介绍GDI

Symbian操作系统GDI支持与设备无关的绘制。所有图形组件和需要图形对象的所有组件,例如文本内容,最终都依赖于GDI。GDI定义了:

基本的度量单位—像素和缇—备份所有的绘制代码都使用这两种度量单位;

色彩的基本定义;

图形设备和图形上下文;

各种字体;

位图化的图形;

设备映射和缩放;

打印。 Symbian操作系统C++(www.cppentry.com) SDK中通过示例为GDI进行了详细的说明。UIQ SDK的示例程序是GraphicsShell。如同其名字所示,该程序是带有一些示例的外壳程序(shell),包括CGraphicsContext支持的各种基本绘制函数、位图化的图形、CPicture类、缩放、离屏位图操作以及内置字体。

我们已经见到过大多数的GDI。在这一简短的章节中,将回顾并探讨更多的主题:位图处理、字体管理、打印、色彩和显示模式以及Web浏览。

1.贴图和位图

当前主要使用位图方式来显示图形。图形基元,例如DrawLine(),必须光栅化(rasterize)或渲染(render)直线—也就是说,它们必须确定需要绘制的像素,从而创建看起来类似于目标直线的位图图像。在 Symbian 操作系统中,BITGDI 负责进行光栅化,它实现所有由CGraphicsContext指定的函数,这些函数用于绘制在屏幕上的位图和离屏位图。

更新位图化显示的另一个方法是直接进行贴图:复制一个位图,其格式与所显示图形的格式兼容。如果源位图和目标位图具有相同的格式,则贴图将非常有效。

所有的GDI都可以很好地利用贴图来优化某些操作。

使用绘制基元不会渲染屏幕上的图标,但在一个绘画程序中已经预先构建了该图标,在需要位图时可以传送到屏幕上。

通过对离屏位图进行渲染(可能非常慢)来执行无闪烁的屏幕重绘,然后,在需要时贴图到屏幕上(一般非常快)。离屏位图由窗口服务器类RBackedUpWindow进行维护。这有助于在需要重绘并且窗口中的内容不会改变时,图像可以简单地从屏幕上进行贴图,而不需要从头开始重绘。这完全根据备份位图进行重绘。

动画是无闪烁更新的特例,可使用贴图序列实现,每个图像帧(image frame)需要一次贴图。

屏幕字体从字体位图中传送到屏幕上(或离屏位图上)。

贴图非常有用,但并不总是最佳的方法。位图使用很多内存,因此,如果可以使用简短的绘制基元序列来构建图形,则通常比将图形存储为位图更为简洁。位图不能有效地进行缩放:如果缩小位图,则会丢失相关信息;如果放大位图,则位图看起来将变得臃肿。同时,缩放的速度一般不快,这就抹杀了运用位图的主要优点之一。位图是固定的:只可以使用位图来存储预先绘制或预先计算的图形,或者使用位图来缓冲计算过的图像,以便在短时间内重用该图像。对于屏幕输出,位图非常有效;而对于打印,位图的效率则非常低,因为涉及在相对缓慢的链接上传输大量的数据。打印也涉及缩放,但对于打印机来说,缩放一般是可以接受的,因为缩放后的尺寸总是类似于用于屏幕上的位图尺寸。

图17.17显示了Symbian操作系统中位图支持类的UML图。  

 

位图的基类是CFbsBitmap,在fbs.h中定义该类。位图的关键属性包括:

它的显示模式—每个像素的位数,以及色彩或者灰度编码模式(查看 gdi.h 中的TDisplayMode枚举以及下面的列表);

以像素为单位的尺寸;

以缇为单位的尺寸;

它的位图数据,可以使用GetScanLine()和其他类似的函数获得这些数据。

注意,CFbsBitmap构造函数只设置像素尺寸,但随后也可以设置缇尺寸(以缇为单位的尺寸是可选项,并且默认值为0.0)。下面的两个函数用于设置以缇为单位的尺寸:可以直接传入一个以缇为单位的尺寸,或者传入一个可用于缩放的图形设备映射(Graphics Device Map),以此将内部存储的像素尺寸转换为缇尺寸,用来缩放。这些函数的定义如下:

 

这些函数用于设置并访问所有的位图属性,并且可使用流(stream)来内部化和外部化位图。CGraphicsContext要求任意图形设备(也包括相关的图形上下文)可对CFbsBitmap对象执行4种基本操作。CGraphicsContext的DrawBitmap函数以下面的某种方式绘制。

从源位图到设备某个区域进行绘制,由它的左上角标识;位图绘制尺寸取决于它的缇尺寸,必须指定该缇尺寸;目标设备从缇转换为像素,这意味着,可以根据实际尺寸绘制位图,而不用考虑源位图和目标位图的缇到像素的映射。

从源位图到设备某个区域进行绘制,由它的绑定矩形标识;位图区域会缩放到适合于目标矩形,并以像素为单位指定该矩形。

从源位图的矩形区域到设备矩形区域进行绘制;位图区域会缩放到适合于目标矩形,并以像素为单位指定两个矩形。 可以使用UseBrushPattern()中的位图绘制背景。

GDI 定义了一个位图化的图形设备 CBitmapDevice 和一个位图化的图形上下文 CBitmap Context。可以读取像素、扫描 CBitmapDevice 中的每一行,并且创建一个用于绘制的CBitmapContext。可以执行一些动作,如清除、复制矩形、贴图和“掩码式贴图”到CBitmapContext(掩码式贴图函数用于绘制带有透明背景的图标)。CBitmapContext::BitBlt()总是执行一对一(one-for-one)的像素贴图,而不考虑像素尺寸。将该函数和CGraphicsContext::DrawBitmap()进行比较,后者总是在需要时进行缩放,即使是从位图复制到位图化的设备时也是如此。

位图由字体和位图服务器进行管理。通过使用 bmconv 预先构建的位图从 Windows 的.BMP文件生成.MBM文件—通常每个应用或组件使用一个MBM文件。MBM文件可以通过一种格式内置到 ROM 中,这种格式对应于 Symbian 操作系统设备的普通屏幕模式的位图布局,从而可以更高效地从这些文件中进行贴图。在贴图到其他地方前,使用非 ROM 组件进行贴图的位图可内置于压缩的 MBM 文件中,从该文件根据需要在往别的地方贴图之前将位图加载到字体和位图服务器(FBS)的共享堆中。应用程序可以分配离屏位图,它们驻留在FBS的共享堆中。

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

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇17.9.4 深入介绍GDI(2) 下一篇18.1 按键、触笔和命令的基础知识

评论

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