第13章图形用户接口(GUI)定义图形用户接口(GraphicsUserInterface,GUI),又叫桌面系统、窗口管理系统、图形操作环境、图形用户界面等,是操作系统和用户的人机接口。GUI极大地方便了非专业用户的使用,人们不再需要死记硬背大量的命令,而可以通过窗口、菜单方便地进行操作。13.1图形用户接口的层次结构应用程序高级图形函数库图形基础设施操作系统GUI窗口管理系统13.1.1图形基础设施图形基础设施是一种底层的图形驱动引擎,一般是由操作系统提供。它是用作其他更高一层图形或者图形应用程序的基本函数库/依赖库,在其之上可以针对某些特定应用需求做进一步的封装。譬如,在对于只需要单任务的低端应用,可以以API函数的形式,封装成静态或者动态的高级图形函数库。而在更多的场合,用户是需要类似Windows的桌面系统,这样就要构建多任务GUI窗口管理系统。在Linux环境下,常见的图形基础设施有SVGALib(VGA)、XWindow(Xlib)、LibGGI和FrameBuffer等。13.1.2高级图形函数库高级图形函数库提供的图形界面编程接口主要分为两大类,一类只提供基本的画点绘线、文本区域处理等,如SDL(standarddrawinglibrary);另一类就是以窗口部件(widget,亦称为控件、部件等)形式,采用面向对象方式进行可视化的编程,可用于嵌入式GUI系统(需要诸如pThread等消息处理函数库的支持)和可以运行在GUI系统上的应用程序的开发,诸如GTK,QT和PEG等。13.1.3GUI窗口管理系统GUI窗口管理系统是一个非常复杂的系统,很多时候甚至就类似于一个操作系统,它是嵌入式系统设计中迄今为止没有很好解决的难点之一。目前,在桌面GUI系统领域主要有X-Windows、KDE、GNOME等,在嵌入式系统领域,主要有MiniGUI、Nano-X(Microwindows)、OpenGUI和Qpe(QtPalmtopEnvironment)等。13.2桌面Linux系统中GUIKDE(KoolDesktopEnvironment)与GNOME(GNUNetworkObjectEnvironment)是目前桌面Linux/UNIX系统中最常用的桌面GUI窗口系统。MiniGUI、Qt/E和Nano-X则是嵌入式系统中广泛应用的嵌入式GUI系统。13.2.1KDEKDE是1996年德国MatthiasEttrich发起了符合GPL规范的开源项目,与之前各种基于XWindow的图形用户环境不同的是,KDE并非针对系统管理员等高级用户,而是锁定为普通的终端用户,即希望KDE能够包含用户日常应用所需要的所有应用程序组件,例如Web浏览器、电子邮件客户端、办公套件、图形图像处理软件等。13.2.2GNOMEGNOME是1997年墨西哥年仅26岁的程序员MiguelDeIcaza发起的开源项目,目前诸如RedHat/Fedora、SuseLinux发行版都默认使用它。它功能上的特性和KDE类似,并且相对要轻便些13.3嵌入式Linux系统GUI在现代的嵌入式人机系统中,人是用户和主动的参与者,能与机器对话,要求机器对人的各种动作做出响应。因此,图形用户界面已经成为嵌入式应用系统研制中的重点之一。典型的嵌入式GUI系统有紧缩的XWindow系统、MiniGUI、Nano-X(MicroWindows)、TinyX(紧缩版的X-Windows)、OpenGUI、QT/Embedded等.13.3.1MiniGUIMiniGUI是1998年底推出的一款面向嵌入式系统或者实时系统的GUI系统,是国内最早出现的、在国际上有一定知名度的几个自由软件项目之一,最先是由原清华大学教师魏永明先生主持开发,现由北京飞漫软件技术有限公司进行商业化维护和运作。自1999年初以遵循GPL协议发布第一个版本以来,MiniGUI已广泛应用于手持信息终端、机顶盒、工业控制系统及工业仪表、便携式多媒体播放机、查询终端等产品和领域。13.3.2QtopiaQtopia是嵌入式GUI窗口系统,也叫做嵌入式Linux的桌面系统,是Trolltech面向嵌入式设备的Qt掌上机环境(QtPalmtopEnvironment,Qpe)。它建立在Qt/Embedded(即Qt/E)之上,基于Qt/E开发出来的程序就可以放到这个桌面上,为开发提供了一个类似于Windows这样易于使用的界面。Qtopia分为开源的PDA版本Qtopia和收费的手机版Qtopia,前者提供PDA的桌面系统基本源代码,后者还包括手机模块代码等。13.3.3Nano-XNano-X的前身就是CenturySoftware推出的开源项目Microwindows。它主要采用C语言进行开发,采用C/S体系结构,提供了相对完善的图形功能,并且具有分层设计。最底层是屏幕和输入设备驱动程序(关于键盘或鼠标)来与实际硬件交互。在中间层,可移植的图形引擎提供对线的绘制、区域的填充、多边形、裁剪以及颜色模型的支持。13.4MiniGUI的开发初步MiniGUI具有良好的软件架构,通过抽象层将MiniGUI上层和底层操作系统隔离开来。如图13.4.1所示,基于MiniGUI的应用程序一般通过ANSIC库、操作系统和驱动程序接口以及MiniGUI自身提供的API来实现自己的功能;MiniGUI中的“可移植层”可将特定操作系统及底层硬件的细节隐藏起来,而上层应用程序则无需关心底层的硬件平台输出和输入设备。13.4MiniGUI的开发初步13.4.1MiniGUI的开发环境MiniGUI的开发可以在Linux或Windows操作系统下进行。由于MiniGUI完全用C来编写,具有非常好的移植性,也使得MiniGUI应用程序的交叉编译工作十分方便。一般而言,为嵌入式设备编写的应用程序可以在任何安装在针对该设备的交叉编译工具链的平台上进行编译,比如在桌面Linux环境下安装针对ARMCPU平台交叉编译器(arm-linux-gcc等),然后再对应用程序进行交叉编译。这里给出windows下面编译minigui的步骤(wvfb):①首先要从网上下载MinGuiForWin32开发包的源代码。minigui-dev-1.6.9-win32.tar.tar;②解压后,把dll文件夹下的minigui.libpthreadVC1.lib拷贝到helloworld文件夹下(以便程序能够在当前目录下找到DLL文件),然后进入helloworld文件夹找到helloworld.dsw,用vc++打开;③然后在工程菜单内>>设置>>选择C/C++分类中选择预处理在包含路径中填入../include,../include/minigui,../include/pthread-win32④在LINKE目录下选择general,然后把LIB里的库文件加在对象/库模块的后面,也就是那两个minigui.libpthreadVC1.lib,⑤最后在分类中选择INPUT把库文件地址连接进去也就是../LIB⑥打开wvfb文件夹下的wvfb.exe,然后在vc++中执行helloworld.这里要注意的是,MiniGUIforWin32是预编译的函数库,因此,其中的功能特性是固定的,包括编译时选项和运行时选项。13.4.2MiniGUI的移植1.PC机上配置,编译,安装,运行MiniGUI(1)在redhat9.0上配置FrameBuffer要激活VESAFrameBuffer驱动程序,需要修改/boot/grub/menu.lst文件,并在kernel打头的一行添加vga=0x0317.其中RedHatLinux(2.4.20-8,FrameBuffer)就是设置了VESAFrameBuffer的引导选项。(2)在PC上编译并安装MiniGUI开发包第一步,在PC上编译并安装libminigui第二步,在PC上安装MiniGUI的资源第三步,编译应用程序例子(3)Redhat上MiniGUI的运行由于必须要在控制台模式才能运行MiniGUI。要启动控制台,按住Ctrl+Alt的同时,按F1~F6中的任意一个均可,然后登录系统,进入sample目录,直接运行即可。2.交叉编译,并在嵌入式目标机上运行MiniGUI(1)交叉编译libminigui(2)安装MiniGUI资源文件(3)编译应用程序例子(4)在嵌入式目标机上运行MiniGUI13.4.3MiniGUI应用编程库MiniGUI在嵌入式产品中移植好后,就要进行相应的产品应用程序的开发。应用程序开发人员可以直接调用MiniGUI的窗口以及图形接口编写自己的应用程序,也可以利用MiniGUI内建的各种控件(control/widget)来快速开发自己的应用程序。MiniGUI提供了各种丰富的控件,如按钮,工具栏等。同时还为开发者提供了自定义控件的接口,并能方便地对已有控件进行扩展。13.5Qt/Embedded13.5.1Qt/Embedded的应用架构Qt/Embedded简称为Qt/E,是著名的QT开发商Trolltech推出的面向嵌入式系统领域的QT开发包,是一组用于访问嵌入式设备的QtC++API函数库。它以原始桌面Qt为基础,并做了许多出色的调整以适用于嵌入式环境,提供了丰富的窗口小部件(Widgets),并且还支持窗口部件的定制,可为用户提供漂亮的图形界面。13.5Qt/EmbeddedLinux内核Qt/Embedded库FramebufferXwindowsserverQt/XlibQt/X11QtAPI接口函数QtopiaGUI应用程序控制台图形化Framebuffer是Linux2.2.x以上内核的版本中的提供的一种图形驱动程序接口。这种接口采用内存映射(mmap)系统调用,将显示设备抽象为帧缓冲区。用户可以将它看成是显示内存的一个映象,将其映射到进程地址空间之后,就可以直接进行读写操作了,而写操作可以立即反映在屏幕上。Framebuffer驱动程序是最重要的驱动程序之一,正是这个驱动程序才能使系统屏幕显示内容。13.5.2QVFB虚拟运行环境QVFB是“Qt/EmbeddedVirtualFramebuffer”的简称,即Qt/E的虚拟帧缓冲,是在桌面Linux中为嵌入式图形应用程序提供一个虚拟的运行环境。它实际上就是由一个X11的应用程序在共享的内存去也中来模拟了一个缓冲帧,通过指定显示设备的宽度,高度和颜色深度,虚拟出来的缓冲帧将和物理的嵌入式显示设备在每个像素上保持一致。使用QVFB的方法如下:①将Qt/E源代码中的qvfb目录作为正常的x86PC平台的Qt/X11应用程序来编译,而不要做为Qt/E的应用程序来编译。②这时就可以运行一些已经编译后的二进制Qt/E应用程序,命令行中要用参数-qws表示将它作为Qt/E服务器。13.6Qt开发及运行环境的创建13.6.1Qt/E应用程序在PC虚拟平台上的运行1、Qt/E应用程序在PC虚拟平台上的运行首先,下载Qt开发环境的源程序包。2、Qt/E应用程序在嵌入式设备中的运行要将写好的Qt/E应用程序移植到嵌入式设备上运行,需要对Qt/Embedded采用交叉编译的方式重新进行编译,生成一些适合于嵌入式Linux的函数库。3、Qtopia窗口系统在PC虚拟平台上的运行要在PC平台上建立起Qtopia窗口系统的虚拟运行环境,除了同前面一样要编译BuildQt/X11、BuildQvfb(QTEDIR/tools/qvfb)和Buildlibqte外,就另外还需要编译Qtopia这个GUI系统。4、Qtopia窗口系统在嵌入式设备中的运行实际上就是将Qtopia窗口系统移植到嵌入式设备中的运行,其前面几个步骤同“Qt/E应用程序在嵌入式设备中的运行”,只是最后将需要拷贝到开发板上的文件整理到一个单独的