GAL 层完成系统对具体的显示硬件设备的操作, 极大程度上隐藏各种不同硬件的技术实现细节,为应用程序开发人员提供统一的图形编程接口。IAL 层则需要实现对于各类不同输入设备的控制操作,提供统一的调用接口。GAL 层与IAL 层的设计屏蔽了底层硬件的多样性,可以极大程度地提高嵌入式GUI 的可移植性。另外利用GAL 可大大提高GUI 的可移植性,并且使程序的开发和扩展变得更加容易。图形抽象层使用GFX 数据结构来表示图形引擎系统;系统通过输入设备层将底层的各种设备统一映射成上层应用程序支持的两种基本输入设备——鼠标设备和键盘设备。对于具体的硬件设备,只要根据驱动程序提供的接口,编写程序实现相应的抽象接口,就能将各种设备模拟成为鼠标或者键盘进行输入。
系统通过维护一个已注册图形引擎数组,保存每个图形引擎数据结构的指针。系统利用一个指针保存当前使用的图形引擎。每个图形引擎的数据结构定义了该图形引擎的一些信息,实现GAL 所定义的各个接口,包括初始化和终止、画点处理函数、画线处理函数、矩形框填充函数、调色板函数等。
3.2 图形设备接口(GDI) 图形设备接口是建立在图形抽象层上的一个独立的绘图应用接口,它将图形抽象层提供的接口功能进一步封装和扩充,向更高层的应用程序提供使用更为简便,功能完善的绘图功能。lightGUI 采用了Windows 类似于Windows 中的GDI 模块。它提供设备上下文(Device Context) 操作、基本GDI 对象操作(包括画笔、画刷、字体、位图、区域等)。在该系统中,设备上下文的定义采用如下数据结构:typedef struct gdi_DC{ int DrawPointx; int DrawPointy; int DrawOrgx; int DrawOrgy; int DrawRangx; int DrawRangy; int DrawRop; COLORREF BackColor;
COLORREF FontColor;
}DC,*PDC
系统中设置和设备上下文主要的API 如表所示
CreateDC(): 创建新的设备上下文
DispatchDC(PDC):释放设备上下文
GetDrawDes (PDC,POINT*): 获取设备上下绘图坐标原点
GetDrawRange(PDC,POINT*):获取上下文绘图坐标范围
GetBackColor(PDC,int* ):获取上下文绘图背景色
3.3 消息驱动机制的设计实现系统的基本通信机制是事件驱动消息机制。系统线程与系统中所有的窗口拥有自己的消息队列。系统线程,该队列中存放所有从底层输入设备接收到的各类控制消息,等待系统线程分配到应用程序窗口;系统中所有的窗口私有消息队列用来存放发送到该窗口的所有消息,等待窗口进一步处理。在系统中消息分为四类:系统消息、外部时间消息、窗口菜单消息、窗口控件消息。在消息驱动的应用程序中,外设发生的事件(例如键的敲击)都由支持系统收集,将其以事先约定格式翻译为特定的消息。应用程序一般包含有自己的消息队列,系统将消息发送到应用程序的消息队列中。应用程序可以建立一个循环,在这个循环中读取消息并处理消息,直到特定的消息传来为止。当窗口没有消息可处理时,消息循环处理阻塞状态,这时不消耗CPU 资源。在GUI 中应用程序处理消息队列中的消息分为GetMessage()从消息队列中获取消息。GetMe
ssage()函数有2个参数,一个用来存放接收到的消息数据,另一个是应用程序主窗口句柄。当获得一个消息时,会将该消息的目标窗口确认为应用程序主窗口。如果收到的消息不是MSG_QUIT
3.4 窗口的设计实现窗口管理模块支持多窗口的同时显示,可进行窗口的创建、移动、大小调整等操作。窗口设计中包括主窗口、窗口菜单、窗口控件、窗口主过程和窗口相关的API函数。在设计中对每个窗口都采用自身的主过程来完成自身消息的处理工作3.5 控件层(Controls) 控件层是窗口的子窗口。这些子窗口的行为与主窗口一样,既能够接收键盘和鼠标等外部输入,也可以在自己的区域内进行输出,只是其所有活动被限制在主窗口中。控件层设计实现了基本控件,包括按钮、静态文本框、单选(多选)框、绘图框等多种通用控件。控件层充分挖掘了基本窗口系统的潜力。向用户提供最常用的功能,极大地简化用户开发的过程。
4 结束语
本文介绍了嵌入式图形用户界面系统的基本架构和实现原理,提出了嵌入式环境下自主、轻型、占用资源少可配置的GUI 系统的解决方案。轻量级 GUI 系统已在Linux 系统上测试通过。本文所开发所采用的体系结构以及面向对技术对窗口用户控件的开发极大的提高了开发效率和代码的重用率,对开发自主的GUI 系统有一定的借鉴和参考价值。本文作者创新点:利用Linu x开发平台,研发适用于小型嵌入式系统的专用GUI系统,使用层次结构和面向对象的控件开发技术,缩短开发周期,降低开发成本,为嵌入式GUI系统的开发提供结开发方法的参考。