Windows CE图形特性 (MSDN)
在Microsoft® Windows® CE操作系统和其他的Microsoft Win32® 操作系统中,控制文本和图形显示的子系统称为图形设备接口(Graphics Device Interface,简称GDI)。与桌面产品类似,Windows CE GDI在显示设备和打印设备上绘制直线、曲线、闭图形、文本和位图图像。
在Windows CE 2.0中,对GDI功能进行了扩展,包括了许多其他Win32应用程序编程接口(API)中高级图形特性。优良的图形显示从此不再局限于桌面计算机;GDI让基于 Windows CE的设备可以创建吸引人的、有用的图形。
本文着眼于讨论GDI的每一个特性。着重讨论对Windows CE 1.0所作的改进或者实质性的修改。文章还讨论了这每一个特性与标准的基于Win32的应用程序编程接口的差别。
在这篇文章中,GDI仅仅指Window CE子系统,不是等价于其他基于Windows的平台。
设备上下文
设备上下文(Device Context,简称DC)是一种结构,GDI用它来保存图形对象的信息,这些信息决定了文本和图形在显示器和打印机上的外观。用来决定显示的笔、刷子、字体、颜色和位图的类型都保存在设备上下文中。
Windows CE支持下表所描述的设备上下文。
设备上下文类型 |
目的 |
显示器 |
支持视频显示器上的绘制操作 |
打印机 |
支持打印机上的绘制操作 |
内存 |
支持设备独立位图的绘制操作 |
应用程序绝对不可以直接访问设备上下文;它通过调用可以访问DC的函数间接操纵设备上下文结构。
可以通过调用BeginPaint 函数获得指向设备上下文的句柄。通过GetDC 函数获得设备上下文,通过CreateDC和CreateCompatibleDC函数创建设备上下文。
2.0版本中的新特性
在2.0版本中改进了内存设备上下文,它现在可以与显示DC完全兼容了。打印DC是2.0中的新特性。
与其它基于Win32的平台的差异
Windows CE不支持信息设备上下文。
图形绘制和填充
除了简单的直线绘制功能以外,GDI还可以使用下列功能绘制更多的图形:
函数名称 |
目的 |
Ellipse |
绘制和填充椭圆 |
Polygon |
绘制和填充用户定义的图形 |
Polyline |
由一系列连接的直线段构成,最终的折线可以构成任何形状 |
Rectangle |
绘制和填充矩形 |
RoundRect |
绘制和填充圆角矩形 |
2.0版本的新特性
在2.0版本中,修改了polygon函数,在此基础上可以正确的填充凹多边形和自相交多边形。自相交多边形是指在绘制时,两条边交叉的多边形。
与其他基于Win32的平台GDI不同的是,它既不支持路径或非矩形区域的创建,也不支持LineTo和MoveTo函数。此外,GDI不支持创建下列图形和直线的函数。
- 弧线
- Bezier曲线
- 可变基准线
- 饼图
- PolyPolygon
- PolyPolyline
笔和刷子
笔是用于绘制直线的图形对象GDI;刷子是用于填充闭图形内部的图形对象。
笔
BLACK_PEN和WHITE_PEN都可以以各自的颜色绘制一个像素宽的实线。这些笔以及不绘制任何图形的NULL_PEN都是库里存放的GDI笔。可以使用GetStockObject函数选择库存的笔。
CreatePen和CreatePenIndirect函数可以用来创建不同于库存笔的函数。这些函数可以让用户定义笔的线宽、颜色和样式。下面罗列了可能支持的笔的样式:
笔的样式 |
功能描述 |
PS_SOLID |
绘制实线 |
PS_DASH |
绘制虚线 |
PS_NULL |
不绘制任何线 |
刷子
库存的刷子和库存的笔一样,可以利用SelectObject函数选进设备环境中。CreateDIBPatternBrushPt函数可以用来创建任何尺寸的刷子。图案刷子可以是任何一种颜色或者颜色的组合。
2.0版本的新特性
带有颜色的笔、带有颜色和图案的刷子都是2.0版本中的新特性。
与其他基于Win32的平台的差异
GDI可以支持宽笔和绘制虚线的笔,但是它不支持绘制虚线的宽笔、绘制点线的笔、内部边框笔、任何用于自定义的端盖样式(例如PS_ENDCAP_ROUND).
Windows CE不支持带有阴影线的刷子。但是可以通过CreateDIBPatternBrushPt函数创建定制刷子达到这样的效果。
Windows CE可以支持Microsoft Windows NT® 操作系统支持的多尺寸图案刷子。Microsoft Windows 95操作系统仅仅支持标准的8*8像素的刷子。
位块传输函数
位块传输函数(Bit block transfer,简称blts)用来传输、改变位图。有四种blt函数--PatBlt、BitBlt、MaskBlt、StretchBlt,以及一个相关函数TransparentImage。
Blt函数对像素进行逐位布尔操作,一般称之为光栅操作编码(raster operation code,简称ROPS)。下面的表格描述了ROP编码和使用它们的blt函数。
ROP类型 |
描述 |
ROP2 |
将笔或刷子与目标位图按照16种方式之一进行结合。 |
ROP3 |
将刷子、源位图和目标位图按照256种方式之一结合 |
ROP4 |
使用二进制位“掩码”位图结合前景ROP3和背景ROP3。掩码使用0和1标记使用ROP3的位 |
BLT函数 |
描述 |
PatBlt |
使用选择的刷子和ROP3码绘制选定的矩形 |
BitBlt |
使用选定的刷子、源位图和ROP3码绘制选定的矩形 |
MaskBlt |
使用两个位图和ROP4码绘制给定的矩形 |
StretchBlt |
将位图从源矩形拷贝到目标矩形,把源位图按照目标矩形的尺寸进行拉伸或压缩 |
TransparentImage |
拷贝位图,省略透明颜色绘制的部分 |
Blt函数和ROP码给应用程序编程人员提供强大的、非常有用的工具集,可以用来移动、结合、转换位图。
2.0版本的新特性
1.0版本仅仅支持一部分ROP码;但是在2.0版本中完全获得支持。在新的版本中已经改进了StretchBlt函数,这样被拉伸的图像与源图像更加相似。1.0版本中不支持图像倒置,但是在2.0得到了完全支持。TransparentImage是2.0版本的新特性。
颜色
Windows CE 2.0版本中最令人激动的是增加了对颜色的支持。新的Windows CE GDI支持其他基于Windows的32位平台所支持的所有颜色。
显示设备或操作系统支持的颜色范围主要由它所支持的像素深度所决定。像素深度是用位/像素(bpp)来决定的。每一个位可以是0或者1。仅仅支持1bpp的显示器只支持黑白两种颜色。像素深度为2 bpp可以支持四种颜色(两位的所有可能的结合情况)值:黑色、白色、浅灰色、深灰色。一般情况下,所支持的颜色个数是2的幂函数,其指数是像素的深度。
新的Windows CE GDI支持的颜色深度是1、2、4、8、16、24和32 bpp。更高端像素深度可以支持真彩色显示器,低端的像素深度仅仅支持黑白显示器和应用程序。
GDI颜色系统不仅仅十分强大,而且非常通用。它可以支持不同像素深度的位图之间进行位块传输。这一切都归功于 GDI使用了设备无关位图(device-independent bitmap,简称DIB)。DIB在内部存储数据,独立于任何一种显示器或者打印设备。它自带颜色信息,可以以许多颜色格式显示或者打印,这依赖于显示器或者打印机硬件的性能。几乎所有的GDI图形信息都是以DIB格式进行存储的。
2.0版本的新特性
颜色是2.0版本的新特性。1.0版本仅仅支持1bpp和2bpp的像素深度。
与其他基于Win32的平台的差异
Windows CE支持2bpp像素深度,其他32位Windows平台中不支持这个。
Windows CE不支持抖动
Windows CE不支持压缩位图格式,例如行程长度编码(run-length encoded,简称RLE)位图。
调色板
GDI可以让基于Windows CE的应用程序和显示设备联合确定图形显示的最优方式。应用程序需要使用GetDeviceCaps函数访问显示设备的特征。这样就可以根据设备的最佳显示策略创建设备上下文。
GDI支持调色板和非调色板颜色显示设备。调色板设备在显卡中包括自己内置的颜色调色板;GDI扫描设备显卡中的颜色编码,在颜色表中查找相应的颜色。
调色板设备直接在帧缓冲区像素中进行编码。它们使用像素的位值直接定义颜色,而不使用硬编码调色板。
一旦设备上下文的颜色性能确定了,应用程序就可以使用CreatePalette 函数创建调色板,然后使用SelectPalette将它选进当前的设备上下文。通过这两个函数创建和选择的调色板是逻辑调色板,不同于显示设备使用的系统调色板。RealizePalette函数使系统恢复当前选中的逻辑调色板中的值。
2.0版本中的新特性
颜色调色板和它们相关的函数是2.0版本中的新特性。
与其它基于Win32平台的差异
从编程人员的角度来看,Windows CE和其他Win32操作系统的最大差别是Windows CE不判断后台应用程序调色板和前台应用程序调色板的优先级。运行在前台的应用程序可以完全控制系统调色板。正是因为这样,强烈建议基于Windows CE的应用程序只使用库存调色板中的前十种和后十种颜色,即所谓的"Windows颜色"。即使使用这些颜色的应用程序在后台运行,它们也可以适当的显示,但是使用其它颜色的应用程序就不能了。
字体
GDI支持TrueType® 字体和光栅字体,但是在给定的平台上只可以使用其中的一种。
TrueType字体的轮廓不是通过像素模式定义的,而是由直线和曲线的编码集合决定的,相反光栅字体是由前者决定的。TrueType字体可以被重新调节甚至是旋转。GDI支持所有的Windows标准TrueType字体文件。
2.0版本中的新特性
TrueType字体是2.0版本中的新特性。1.0版本只支持光栅字体。
打印
GDI支持完全的图形打印。
2.0版本中的新特性
打印是Windows CE 2.0的新特性。
与其它基于Win32平台的差异
Windows CE既没有打印机管理器,也不支持假脱机打印或多份打印。打印是单线程,因为一次只允许一个应用程序打印。
显示器特征
Windows CE支持剪辑区域,这可以让应用程序将它们的输出限定在客户区域的某一个子区域上。剪辑区域必须选进给定设备的设备上下文中。
与其它基于Win32平台的差异
Windows CE 不支持多种映射模式。GDI仅仅支持文本映射模式(基于Win32的桌面平台称为MM-TEXT模式),这种方式按照文本的读入方式将位图映射到显示设备,即从左到右,从上到下。视点的初始位置是显示区域的左上角,可以使用SetViewPointOrg函数改变。
小技巧
主要运行在2-bpp或者4-bpp显示设备上的应用程序在任何时候都应该避免使用8-bpp位图,因为颜色转换将会降低blt操作的速度。
IUsage参数在所有函数中应该设置为DIB_RGB_COLORS。但是当使用8-bpp位图的时候它可以被设置称为DIB_PAL_COLORS,这样BITMAPINFO 结构中的bmiColors数组成员的值将会被忽略。
总结
Windows GDI是一个功能完善的图形系统,支持下列特性。
GDI特性 |
支持的属性 |
图形绘制 |
Ellipse、Polygon、Polyline、Rectangle、RoundRect |
笔和刷子 |
虚线、点线、宽的、实线笔;多尺寸刷子 |
Blt函数 |
PatBlt、BitBlt、MaskBlt、StretchBlt、TransparentImage |
ROP编码 |
ROP2、ROP3和ROP4码 |
颜色 |
1、2、4、8、16、24和 32 bbp像素深度 |
调色板 |
调色板和非调色板设备支持 |
字体 |
TrueType和光栅字体 |
打印 |
图形打印 |
Windows CE的功能,包括GDI,既没有基于Win32的桌面系统强大,也没有打算实现如此强大的功能。Windows CE设备不需要的显示和打印函数已经从GDI中删除了。因此GDI是一个空间占有量较小的、强大的、真彩色的图形显示系统。它的小尺寸和多功能性使得它可以在许多Windows CE设备上显示文本和图形,其中有一些还是目前无法想象的。