MicroWindows体系结构及应用程序接口
2 图形引擎特性与实现
图形引擎层的功能是完成图形在实虚屏之间的转换,以Gd...为开头,并将指针传给PSD作为它的首个参数。PSD参数将指定底层的显示模式,例如设备的垂直和水平尺寸、硬件使用的颜色模式。另外,真正执行画图的程序在这一层中作为功能指针使用。所有屏幕坐标都是COORD类型。
颜色在图形引擎中被指定RGB CILORVAL模式,然后被转换成颜色指针,以PIXELVAL模式传给显示硬件,在32bpp(bit per pixel)真彩显示器环境下不必转换。
(1)区域
区域用来描述屏幕上像素点的分布。在MicroWindows中,区域是用一些无交迭的矩形组成的数组来描述的。目前实现区域有两种方法,最初是用一个静态数组CLIPRECTs来描述复杂区域。在这个数组中任一矩形中的点都被认为是存在这个区域中的,另一个全局变量clipcount用来给这个数组中的矩形计数。这个方法没有给区域管理提供入口点,所以整个数组的数据直接被送到负责裁剪功能的函数数口。新方法则可以创建任何数目的区域。用来描述区域的数组CLIPREGION被定义成动态数据组,可动态分配它所包含矩形的数量,这样那些无交迭的矩形被存放在“y-x”类型的队列中。在同一队列中,所有矩形的垂直高度y是一样的,这意味着在每个队列中只有矩形的宽度可变。实际程序是利用Intersection、Union、Subtraction、Exclusive OR等方法来实现创建、删除一个区域或者是将几个区域或矩形合并。以下是这种方法设计的几个函数。
GdAllocRegion 创建一个区域
GdDestroyRegion 删除一个区域
GdCopyRegion 复制区域
GdUnionRectWithRegion 将一个矩形和一个区域合并
GdIntersectRegion 在两个区域的交集处创建一个新区域
GdSubtractRegion 在两个区域的差集处创建一个新区域
GdUnionRegion 在两个区域的并集创建一个新区域
GdXorRegion
(2)裁剪
图形引擎中有一个由图形操作定义的由一些矩形组成的裁剪区,如果点被包含在这些裁减区内就会被绘制出来。有两个裁剪算法:devclipl.c针对静态矩形数组,devclipc2.c针对新的动态数组。GdSetClipRects是唯一删除区域并指定后来的图形操作的入口点。所有的绘图程序都要调用两个附加程序来决定是否画图。GdClipPoint获取屏幕坐标的(x,y)点,如果该点被绘制出来的话,则返回TRUE。GdClipArea获取屏幕上方最左的或者下方最右的点并回以下值:CLIP_VISIBLE(指定区域在原区域内)、CLIP_INVISIBLE(指定区域不在原区域内)、CLIP_PARTIAL(指定区域部分在原区域内)。
(3)画线
MicroWindows使用GdPoint画点,GdLine画线。画线时使用当前的前景色(DgSetForeground指定)。有两种绘制模式:MODE_SET和MODE_COR。
(4)矩形、圆和椭圆以及多边形
矩形、圆和椭圆的绘制分别调用GdRect和GdEllipse来实现。MicroWindows中定义了一个包含(x,y)多边形顶点的数组来表示多边形,调用GdLine函数画线,把这些点相连就可以实现画多边形。绘制时使用前景色。
(5)区域填充
MicroWindows中使用GdFillRect函数填充矩形区域,填充使用前景色。填充圆和椭圆使用GdFillEillpse函数,填充多边形使用GdFillPoly函数。填充的实现是在屏幕驱动中不断地调用GrawHorzLine函数。
(6)字体和文本输出
MicroWindows支持可变/不可变字体。文本输出时使用GdSetFont定义输出使用的字体,再调用GdText函数输出。
(7)颜色模式和调色板
MicroWindows支持RGB颜色,颜色匹配,真彩和调色板显示,3D效果的显示。
(8)图片绘制
MicroWindows支持两种格式的图片。单色图片用IMAGEBITS结构(1表示前景色,0表示背景色)来定义,绘制时调用GdBitmap程序。彩色图片可以分别定义为1、4、8 bpp的模式,用IMAGEHDR结构来表示。绘制时调用GdDrawImage函数。
(9)映射
映射功能在实虚屏的转换中使用。GdBlit可以实现上层的API将虚拟内存存复制到显示屏上,复制时调用GdBlit函数。
3 MicroWindows API
MicroWindows API中的基本通信机制是消息机制。一个消息机制中包含了message number和两个参数:wParam、lParam。Message被存放在应用程序的message-queue中,GetMessage函数将其取出。WM_GHAR针对键盘输入,WM_LBUTTONDOWN针对鼠标键被按下。窗口创建时使用WMCREATE,删除时使用WM_DESTROY。DispatchMessage将消息传到处理程序的窗口。
以下是处理消息的有关函数:
SendMessage 将消息传到窗口
PostMessage 将消息传到消息队列
PostQuitMessage 传递WM_QUIT消息到消息队列读时中断程序
GetMessage 得到消息后结束中断
TranslateMessage 将按键按下/弹起的消息传到WMCAR
DispatchMessage 将消息传到为它分配的窗口程序
3.2 窗口的创建和删除
RegisterClass 定义新的窗口类型并启动窗口程序
UnRegisterClass 删除窗口类型
CreateWindowsEx 按窗口类型创建一个窗口
Deatr