MicroWindows体系结构及应用程序接口(2)
- UID
- 1029342
- 性别
- 男
|
MicroWindows体系结构及应用程序接口(2)
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 按窗口类型创建一个窗口
DeatroyWindow 删除一个窗口
窗口创建后产生WM_CREATE消息,删除产生WM_DESTROY消息。
3.3 窗口的显示、隐藏和移动
ShowWindow函数指定窗口是否可见。MoveWindow改变窗口的位置和大小。窗口位置改变时,产生WM_MOVE消息;窗口大小改变时,产生WM_SIZE消息。
3.4 窗口的绘制
窗口绘制时产生WM_PAINT消息。窗口的标题栏自动绘制,设置属性使用SetWinowText,察看属性使用GetWindowText。
(1)实虚屏切换
窗口绘制使用的坐标系统是屏幕上的绝对坐标系,MicroWindows API使用的是相对坐标系。GetClientRect和GetWindowRect函数各自返回虚屏和实屏的坐标值。
(2)Device Contexts
调用图形API之间要包含device context。它指定系统所使用的窗口和坐标系,同时还定义系统默认的前景色和背景色。
GetDC用来包含device context。在画标题栏还需调用GetWindowDC。GetDCEx定义子/兄弟窗口的裁剪操作。绘制结束时调用ReleaseDC释放DC。
(3)图形API
见网络补充版(http://www.dpj.com.cn)
3.5 其它实用函数
WndSetDesktopWallpaper 设置桌面的背景图片
WndSetCursor 为窗口创建光标
WndRaiseWindow 拉伸窗口
WndLowerWindow 缩小窗口
WndGetTopWindow 返回最上层窗口的句柄
Sleep 睡眠
(1)设置窗口中心
WM_SETFOCUS和WMKILLFOCUS分别用于获取/删除中心。GetActiveWindow返回ancestor窗口,GetDesktopWINDOW返回当前桌面窗口的句柄。
(2)鼠标捕获
WM_MOUSEMOVE用来表示鼠标被移动。SetCapture获取全部的鼠标移动信息,ReleaseCapture返回到程序,GetCaptrue返回到捕获区域。
(3)区域管理
SetRect 定义一个矩形结构
SetRectEmpty 定义一个空矩形
CopyRect 复制一个矩形
IsRectEmpty 为空矩形时返回TRUE
InflateRect 放大矩形
OffsetRect 移动矩形
PtInRect 判断点是否在矩形区内
4 Nano-X API
(1)Client/Server模型
Nano-X允许应用程序使用Client/Server网络协议或本地UNIX Domain Socket,可让几个应用程序运行在嵌入式设备或远端主机上,并连接到Server上显示出来。
(2)窗口的创建和删除
Nan0-X中使用GrNewWindow创建窗口。GrNewInputWindow定义窗口只允许用来输入。函数定义了窗口的边界和颜色。
(3)窗口的显示、隐藏和移动
GrMapWindow用来显示窗口,GrUnmapWindow用来隐藏,GrRaiseWindow用来拉伸,GrLowerWindow用来缩小,GrMoveWindow用来移动,GrResizeWindow用来改变窗口大小。
(4)窗口中的绘制
①Graphics Context。GrNewGC用来分配graphics Context,删除时使用GrDestroyGC,GrCopyGC用来复制。创建一个Graphics Context后,服务器返回一个Graphics Context的ID,用来作为API的参数。GC中不存放裁剪区和系统坐标系。 |
|
|
|
|
|