配色: 字号:
《ARM9嵌入式系统设计基础教程》第13章图形用户接口(GUI)
2023-05-24 | 阅:  转:  |  分享 
  
第13章 图形用户接口(GUI) 定义图形用户接口(Graphics User Interface,GUI),又叫桌面系统、窗口管理系统、
图形操作环境、图形用户界面等,是操作系统和用户的人机接口。GUI极大地方便了非专业用户的使用,人们不再需要死记硬背大量的命令,而可
以通过窗口、菜单方便地进行操作。 13.1图形用户接口的层次结构13.1.1图形基础设施图形基础设施是一种底层的图形驱动引擎,一般
是由操作系统提供。它是用作其他更高一层图形或者图形应用程序的基本函数库/依赖库,在其之上可以针对某些特定应用需求做进一步的封装。譬
如,在对于只需要单任务的低端应用,可以以API函数的形式,封装成静态或者动态的高级图形函数库。而在更多的场合,用户是需要类似Win
dows的桌面系统,这样就要构建多任务GUI窗口管理系统。在Linux环境下,常见的图形基础设施有SVGALib(VGA)、X W
indow(Xlib)、LibGGI和FrameBuffer等。13.1.2高级图形函数库高级图形函数库提供的图形界面编程接口主要
分为两大类,一类只提供基本的画点绘线、文本区域处理等,如SDL(standard drawing library);另一类就是以窗
口部件(widget,亦称为控件、部件等)形式,采用面向对象方式进行可视化的编程,可用于嵌入式GUI系统(需要诸如pThread等
消息处理函数库的支持)和可以运行在GUI系统上的应用程序的开发,诸如GTK,QT和PEG等。13.1.3 GUI窗口管理系统GUI
窗口管理系统是一个非常复杂的系统,很多时候甚至就类似于一个操作系统,它是嵌入式系统设计中迄今为止没有很好解决的难点之一。目前,在桌
面GUI系统领域主要有X-Windows、KDE、GNOME等,在嵌入式系统领域,主要有MiniGUI、Nano-X(Microw
indows)、OpenGUI和Qpe(Qt Palmtop Environment)等。13.2 桌面Linux系统中GUI K
DE(Kool Desktop Environment)与GNOME(GNU Network Object Environment
)是目前桌面Linux/UNIX系统中最常用的桌面GUI窗口系统。MiniGUI、Qt/E和Nano-X则是嵌入式系统中广泛应用的
嵌入式GUI系统。13.2.1 KDEKDE是1996年德国Matthias Ettrich发起了符合GPL规范的开源项目,与之前
各种基于X Window的图形用户环境不同的是,KDE并非针对系统管理员等高级用户,而是锁定为普通的终端用户,即希望KDE能够包含
用户日常应用所需要的所有应用程序组件,例如Web浏览器、电子邮件客户端、办公套件、图形图像处理软件等。 13.2.2 GNOMEG
NOME是1997年墨西哥年仅26岁的程序员Miguel De Icaza发起的开源项目,目前诸如RedHat/Fedora、Su
seLinux发行版都默认使用它。它功能上的特性和KDE类似,并且相对要轻便些 13.3 嵌入式Linux系统GUI 在现代的嵌入
式人机系统中,人是用户和主动的参与者,能与机器对话,要求机器对人的各种动作做出响应。因此,图形用户界面已经成为嵌入式应用系统研制中
的重点之一。典型的嵌入式GUI 系统有紧缩的 X Window 系统、MiniGUI、Nano-X(MicroWindows)、T
iny X(紧缩版的X-Windows)、OpenGUI、QT/Embedded 等.13.3.1 MiniGUIMiniGUI是
1998年底推出的一款面向嵌入式系统或者实时系统的GUI系统,是国内最早出现的、在国际上有一定知名度的几个自由软件项目之一,最先是
由原清华大学教师魏永明先生主持开发,现由北京飞漫软件技术有限公司进行商业化维护和运作。自1999 年初以遵循 GPL 协议发布第一
个版本以来,MiniGUI 已广泛应用于手持信息终端、机顶盒、工业控制系统及工业仪表、便携式多媒体播放机、查询终端等产品和领域。1
3.3.2 QtopiaQtopia是嵌入式GUI窗口系统,也叫做嵌入式Linux的桌面系统,是Trolltech 面向嵌入式设
备的Qt掌上机环境(Qt Palmtop Environment,Qpe)。它建立在Qt/ Embedded(即Qt/E)之上,基
于Qt/E开发出来的程序就可以放到这个桌面上,为开发提供了一个类似于Windows这样易于使用的界面。Qtopia分为开源的PDA
版本Qtopia和收费的手机版Qtopia,前者提供PDA的桌面系统基本源代码,后者还包括手机模块代码等。 13.3.3 Nano
-XNano-X的前身就是Century Software 推出的开源项目Microwindows。它主要采用C语言进行开发,采用
C/S体系结构,提供了相对完善的图形功能,并且具有分层设计。最底层是屏幕和输入设备驱动程序(关于键盘或鼠标)来与实际硬件交互。在中
间层,可移植的图形引擎提供对线的绘制、区域的填充、多边形、裁剪以及颜色模型的支持。 13.4 MiniGUI的开发初步MiniGU
I具有良好的软件架构,通过抽象层将MiniGUI 上层和底层操作系统隔离开来。如图13.4.1所示,基于MiniGUI 的应用程序
一般通过ANSI C 库、操作系统和驱动程序接口以及MiniGUI 自身提供的API 来实现自己的功能;MiniGUI 中的“可移
植层”可将特定操作系统及底层硬件的细节隐藏起来,而上层应用程序则无需关心底层的硬件平台输出和输入设备。13.4 MiniGUI的开
发初步13.4.1 MiniGUI 的开发环境 MiniGUI 的开发可以在Linux 或Windows操作系统下进行。由于Min
iGUI 完全用C 来编写,具有非常好的移植性,也使得MiniGUI 应用程序的交叉编译工作十分方便。一般而言,为嵌入式设备编写的
应用程序可以在任何安装在针对该设备的交叉编译工具链的平台上进行编译,比如在桌面Linux 环境下安装针对ARM CPU平台交叉编译
器(arm-linux-gcc等),然后再对应用程序进行交叉编译。 这里给出windows下面编译minigui的步骤(wvfb)
:① 首先要从网上下载MinGui For Win32 开发包的源代码。minigui-dev-1.6.9- win32.tar.
tar;② 解压后,把dll文件夹下的minigui.lib pthreadVC1.lib拷贝到helloworld文件夹下(以便
程序能够在当前目录下找到DLL文件),然后进入helloworld文件夹找到helloworld.dsw,用vc++打开;③ 然后
在工程菜单内>>设置>>选择C/C++>>分类中选择预处理在包含路径中填入../include,../include/minigu
i,../include/pthread-win32④ 在LINKE目录下选择general,然后把LIB里的库文件加在对象/库模
块的后面,也就是那两个minigui.lib pthreadVC1.lib,⑤ 最后在分类中选择INPUT把库文件地址连接进去也就
是../LIB⑥ 打开wvfb文件夹下的wvfb.exe,然后在vc++中执行helloworld .这里要注意的是,MiniGU
I for Win32是预编译的函数库,因此,其中的功能特性是固定的,包括编译时选项和运行时选项。 13.4.2 MiniGUI的
移植1. PC 机上配置,编译,安装,运行MiniGUI(1)在redhat9.0 上配置FrameBuffer要激活VESA F
rame Buffer 驱动程序,需要修改/boot/grub/menu.lst 文件,并在kernel打头的一行添加vga=0x
0317.其中Red Hat Linux (2.4.20-8,FrameBuffer)就是设置了VESA FrameBuffer
的引导选项。 (2)在PC上编译并安装MiniGUI开发包第一步,在PC 上编译并安装libminigui第二步,在PC 上安装M
iniGUI 的资源第三步,编译应用程序例子(3)Redhat上MiniGUI 的运行由于必须要在控制台模式才能运行MiniGUI
。要启动控制台,按住Ctrl+Alt 的同时,按F1~F6 中的任意一个均可,然后登录系统,进入sample 目录,直接运行即可。
2. 交叉编译,并在嵌入式目标机上运行MiniGUI(1) 交叉编译libminigui(2) 安装MiniGUI 资源文件(3)
编译应用程序例子(4) 在嵌入式目标机上运行MiniGUI13.4.3 MiniGUI应用编程库MiniGUI在嵌入式产品中移植
好后,就要进行相应的产品应用程序的开发。应用程序开发人员可以直接调用MiniGUI的窗口以及图形接口编写自己的应用程序,也可以利用
MiniGUI 内建的各种控件(control/widget)来快速开发自己的应用程序。MiniGUI 提供了各种丰富的控件,如按
钮,工具栏等。同时还为开发者提供了自定义控件的接口,并能方便地对已有控件进行扩展。13.5 Qt/Embedded13.5.1 Q
t/Embedded的应用架构Qt/Embedded简称为Qt/E ,是著名的QT开发商Trolltech推出的面向嵌入式系统领域
的QT开发包,是一组用于访问嵌入式设备的 Qt C++ API函数库。它以原始桌面Qt为基础,并做了许多出色的调整以适用于嵌入式环
境,提供了丰富的窗口小部件(Widgets),并且还支持窗口部件的定制,可为用户提供漂亮的图形界面。 13.5 Qt/Embedd
edFramebuffer是Linux 2.2.x以上内核的版本中的提供的一种图形驱动程序接口。这种接口采用内存映射(mmap)系
统调用,将显示设备抽象为帧缓冲区。用户可以将它看成是显示内存的一个映象,将其映射到进程地址空间之后,就可以直接进行读写操作了,而写
操作可以立即反映在屏幕上。Framebuffer驱动程序是最重要的驱动程序之一,正是这个驱动程序才能使系统屏幕显示内容。 13.5
.2 QVFB虚拟运行环境QVFB是“Qt/Embedded Virtual Framebuffer”的简称,即Qt/E的虚拟帧缓
冲,是在桌面Linux中为嵌入式图形应用程序提供一个虚拟的运行环境。它实际上就是由一个X11的应用程序在共享的内存去也中来模拟了一
个缓冲帧,通过指定显示设备的宽度,高度和颜色深度,虚拟出来的缓冲帧将和物理的嵌入式显示设备在每个像素上保持一致。 使用QVFB的方
法如下:① 将Qt/E源代码中的qvfb目录作为正常的x86 PC平台的Qt/X11应用程序来编译,而不要做为Qt/E的应用程序来
编译。 ② 这时就可以运行一些已经编译后的二进制Qt/E应用程序,命令行中要用参数-qws表示将它作为Qt/E服务器。13.6 Q
t开发及运行环境的创建13.6.1 Qt/E应用程序在PC虚拟平台上的运行1、 Qt/E应用程序在PC虚拟平台上的运行首先,下载Q
t开发环境的源程序包。 2 、Qt/E应用程序在嵌入式设备中的运行 要将写好的Qt/E应用程序移植到嵌入式设备上运行,需要对Qt/
Embedded采用交叉编译的方式重新进行编译,生成一些适合于嵌入式Linux的函数库。 3、 Qtopia窗口系统在PC虚拟平台
上的运行 要在PC平台上建立起Qtopia 窗口系统的虚拟运行环境,除了同前面一样要编译Build Qt/X11、Build Qv
fb(QTEDIR/tools/qvfb)和Build libqte外,就另外还需要编译Qtopia这个GUI系统 。4、 Qto
pia窗口系统在嵌入式设备中的运行 实际上就是将Qtopia窗口系统移植到嵌入式设备中的运行,其前面几个步骤同“Qt/E应用程序在
嵌入式设备中的运行”,只是最后将需要拷贝到开发板上的文件整理到一个单独的文件夹里面,然后再下载烧录到嵌入式设备的FLASH中。13
.6.2 Qt/E应用程序在嵌入式设备中的运行要将写好的Qt/E应用程序移植到嵌入式设备上运行,需要对Qt/Embedded采用交
叉编译的方式重新进行编译,生成一些适合于嵌入式Linux的函数库。移植过程中都是采取宿主机和目标机的开发模式。宿主机是一台运行Re
dhat Linux 的PC 机,目标机是基于S3C2410的嵌入式设备。 先在宿主机上调试通过后,再移植到目标机上。详细步骤如下
: (1)Build Qt/Embedded(2)修改tmake 配置文件(3)生成可执行文件13.6.3 Qtopia窗口系统在
PC虚拟平台上的运行要在PC平台上建立起Qtopia 窗口系统的虚拟运行环境,除了同前面一样要编译Build Qt/X11、Bui
ld Qvfb(QTEDIR/tools/qvfb)和Build libqte外,就另外还需要编译Qtopia这个GUI系统,13
.6.4 Qtopia窗口系统在嵌入式设备中的运行实际上就是将Qtopia窗口系统移植到嵌入式设备中的运行,其前面几个步骤同“Qt
/E应用程序在嵌入式设备中的运行”,只是最后将需要拷贝到开发板上的文件整理到一个单独的文件夹里面,然后再下载烧录到嵌入式设备的FL
ASH中。13.7 Qt应用程序的开发13.7.1 Qt/E基本控件1.窗体交互界面。Qt 拥有丰富的满足不同需求的窗体,使用起来
很灵活,而且它容易被子类化,以满足不同的需求。窗口部件是用户界面的一个原子:它从窗口系统接收鼠标、键盘和其它事件,并且在屏幕上绘制
自己的表现。每一个窗口部件都是矩形,并且它们按Z轴顺序排列的。一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分。13
.7.1 Qt/E基本控件2、对话框使用可视化Qt 图形设计器设计工具用户可以建立自己的对话框。Qt使用布局管理自动设置窗体和别的
窗体之间相对的 尺寸和位置,这样可以确保对话框能够最好的利用屏幕上的可用空间。Qt提供很多常用的对话框,例如,选择文件等。 13.
7.2开发工具Qt designer介绍Qt 图形设计器是一个具有可视化用户接口的设计工具。Qt的应用程序可以完全用纯命令行下的代
码编写,也可Qt图形设计器这种集成开发环境来开发。 13.7.3 控制台上的Qt/E应用编程所谓控制台上的Qt/E应用程序,就是指
利用Qt/E库函数设计的图形化应用程序,直接在Linux的控制台下启动运行,而不是在GUI桌面系统中运行。这里的控制台可以目标机的
嵌入式Linux,也是宿主机的桌面Linux,只是后者要先运行qvfb。 1.一个典型的Qt应用程序分析//hello.cpp精简
的源程序1 #include 2 #include 3 int main(in
t argc, char argv)4 {5 QApplication app (argc, argv);6 QLabel
hello = new QLabel("Hello Qt/Embedded!", 0);7 app.setMainWidget(h
ello);8 hello->show();9 return app.exec();10 }第1 行和第2 行包含了两个头文件,这
两个头文件中包含了QApplication 和QLabel类的定义。第5 行创建了一个QApplication 对象,用于管理整个
程序的资源,它需要2 个参数,因为Qt 本身需要一些命令行的参数。第6 行创建了一个用来显示Hello Qt/Embedded!的
部件。在Qt 中,部件是一个可视化用户接口,按钮、菜单、滚动条都是部件的实例。部件可以包含其它部件,例如,一个应用程序窗口通常是一
个包含QMenuBar、QToolBar、QStatusBar 和其它部件的一个部件。在QLabel 函数中的参数0 表示,这是一
个窗口而不是嵌入到其它窗口中的部件。第7 行设置hello 部件为程序的主部件,当用户关闭主部件后,应用程序将会被关闭。如果没有主部件的话,即使用户关闭了窗口程序也会在后台继续运行。第8 行使hello 部件可视,一般来说部件被创建后都是被隐藏的,因此可以在显示前根据需要来订制部件,这样的好处是可以避免部件创建所造成的闪烁。第9 行把程序的控制权交还给Qt,这时候程序进入就绪模式,可是随时被用户行为激活,例如点击鼠标、敲击键盘等。2.完成一个Qt应用程序的建立步骤第一步:新建一个空的工程文件(.pro)第二步:新建一个用户接口窗体(.ui)第三步:生成hello.h和hello.cpp第四步:编写主函数main()第五步:修改工程文件hello.pro第六步:生成Makefile 文件13.7.4 Qtopia上的Qt/E应用编程要想将开发的应用程序添加到GUI窗口系统qtopia中运行,则还需要完成下面步骤:1.准备好camera程序的图标文件2.建立.desktop文件,这是最为重要的。3.运行
献花(0)
+1
(本文系大高老师首藏)