如何在电子产品屏幕画上美图如何在电子产品上画画

最近接到客户的要求,在飞思卡尔板子上实现类似Windows桌面的GUI显示,并能使用触摸板进行操作。于是作者收集一些常见的图形设计软件,并研究了一下GUI发展历史。

基础库X Window简介

X只是一种协议,屏幕、鼠标、键盘等输入输出设备由一个名为X server的程序来统一管理,其他应用程序称为X client,client需要在屏幕上显示时,向server提出请求,server再操作具体硬件来完成。X server和X client通过一定的协议进行通信。X的代码实现有多种方式,最流行的是XFree86和Xorg两种。基于X实现的GUI(Graphical User Interface,图形用户接口)系统称为X Window System(简称X Window或X)。Linux中的/usr/X11R6目录就是XFree86的默认安装目录,X11R6 实际上是 X Protocol version 11 Release 6。KDrive,也被称为Tiny-X,是XFree86的一部分,由Keith Pachard先生所发展,而他本身就是XFree86专案的核心成员之一。一般的X Server都太过于庞大,因此Keith Packard就以XFree86为基础,精简了不少东西而成Tiny X Server,它的体积可以小到几百Kb而已,非常适合应用于嵌入式环境。

X Window的C/S架构

C/S架构是X Window最基本的架构,X Window的主体包括作为服务器运行的X Server,和中间的传输协议X Protocol,和客户封装X Protocol的函数库Xlib。应用程序通过Xlib把参数打包成X Protocol的格式,通过socket把请求发送给X Server,X Server执行请求之后再把返回值从原路返回给应用程序。

与传统的C/S架构不同的是,X Server并不是单纯的接受请求然后响应请求,它还可以主动主报事件,这通常是输入设备产生的事件。当然为了避免不必要的事件传输的开销,客户端可以决定接受哪些事件,过滤掉哪些事件。

x window架构

从理论上说,客户端是可以不依赖于任何其它库,直接打包所有请求参数,解包所有的响应数据,就可以开发出基于X Window的应用程序。然而,这些打包解包操作比较繁琐,容易出错,也没有必要每个人都这样去做,Xlib封装了所有这些操作,简化了X程序的开发工作。

毫无疑问,基于Xlib可以写出在X Window上运行的GUI程序。在前面提到的X Window提供的服务中,我们可以看出,X Window提供的是非常底层的服务,就窗口而言,X Window根本不知道按钮、菜单、单选框、复选框、列表框、甚至不知道窗口管理器的存在,它唯一知道的就是窗口,这些都是非常低级的操作。

为了简化X应用程序的开发,不同组织开发了众多的 X toolkit,在这些toolkit中,都实现了一些常用的组件,以及一些公共函数。GTK+和QT是目前最流行的X toolkit,GTK+用C开发的,QT是用C++开发的,从功能、风格和易用性来看,两者各有千秋,难分伯仲。

X Window System的分层架构

● X Server

X Window System架构上有一项特点是别的GUI系统所没有的,这个特点就是Client/Server架构,注意这里和一般我们所熟知的某某服务器(Server端)跟PC端(Client端)相连接的情形是不同的惟一类似的是X Window System本身也是采用网路架构设计。具体而简单一点的说明就是,X Client可以看作我们在X上执行的软件,X Server则是负责显示及传递使用者输入事件(包括键盘、鼠标等硬件装置的输入)。

● Graphic Library

我们可以把一幅图案想象成有成千上万个细微小点所组成,这种小点的单位通常为 pixel,在同一平方单位里这些小点数越高图案就越清晰、画质就越好,也就是说分辨率或解析率高。事实上我们要设计的视窗当然不可能是这样一点一点地画上去的,这样太过浪费时间,基于这种观念我们就设计出高阶一点的函数来帮助我们解决这个繁琐的步骤,例如各类视窗编程里用到的画点、画线、画矩形、画圆形、画不规则形、上色等函数。透过这些函数是的程序设计者不用去管画一条线要几个点以及如何让显示器显示等林林总总低阶的工作,我们称绘图相关的一组函数库为GUI的基本Graphic Library。

● Toolkits

有了点、线、面的函数之后,虽然已经去除了大半的重复无聊工作,但是就开发视窗程序来说,还是显得非常没有效率,怎么办呢?只有继续将构成视窗的抽象元件,如按钮、卷轴、组合框等各类控件抽离出来,重新定义一组更高阶的函数库,在配合上联系的语法函数就成立Toolkits这类的东西,目前流行的有QT、GTK+等。

● Window Manager

有了Toolkits,我们可以很轻松地建立视窗模块(X Client),但是每个视窗模块只负责自己模块内的事务,那么不同视窗间的沟通、协调,例如视窗的切换、放大、缩小等,就没有模块管理了,于是视窗管理员(Window Manager)就应运而生了。

● Internationalization

国际化通常是我们东方语系国家的人比较关心的议题,但是很多软件一开始都由西方国家所主导开发,因此这点常常受到忽略,这个问题牵扯的层面很多,上从语言的显示、输入、中止语言习惯,下到文字位元的处理,完整的解决是必须从头到脚彻底配合才能达成,只处理一半都只能说是一个蹩脚的系统。

嵌入式系统中的GUI

GUI架构

虽然X Window System架构不错,但却不适合在嵌入式环境中使用,因为相关的程序过于庞大。因此有很多嵌入式GUI系统把上述几点合并,甚至全部绑在一起,当然这会失去很多弹性和功能,但却也是一种权衡的做法。

Tiny X

Tiny X是XFree86为适应嵌入式环境进行精简而得到的。因为与桌面的X架构相同,因此相对于很多以Qt、GTK+、FLTK等开发的软件可以很容易地移植上来。 Qt/Embedded

Qt是Trolltech公司的一个跨平台的C++图形框架,包含多个版本:桌面版本 嵌入式版本图形库 Qt/X11 Qt/Embedded(即Qt/E)桌面环境 KDE(基于Qt/X11) QPE(先后更名为Qtopia、Qt Extended)

Qt/X11是基于X Windows系统的Qt版本,KDE便是基于它来构建的。

Qt/Embedded(即Qt/E)则是Qt的嵌入式版本,直接基于Linux中的FrameBuffer设备,采用模块化设计,最小可以缩到800Kb左右。

QPE(Qt Plamtop Environment)是针对PDA软件的整体解决方案,包含了从底层的GUI系统、Window Manager、Soft Keyboard到上层的PIM、浏览器、多媒体等方面。QPE先后更名为Qtopia、Qt Extended,但目前诺基亚停止了Qt Extended的开发。

Qt的主要优点是可移植性好。因为Qt是KDE等项目使用的GUI支持库,所以许多基于Qt的X Window程序可以非常方便地移植到Qt/Embedded版本上。

GtkFB

GtkFB是GTK+为嵌入式系统推出一套基于GTK+的GUI解决方案。与Qt/Embedded类似,GtkFB也跳过X层直接与FrameBuffer沟通,因此也具有Qt/Embedded的几项优点。

MiniGUI

MiniGUI是由北京飞漫软件技术有限公司创办的开源Linux图形用户界面支持系统,是比较成熟的性能优良的、功能丰富的跨操作系统的嵌入式图形界面支持系统。由于是中国人自己开发的GUI系统,MiniGUI对于中文的支持最好。MicroWindows/NanoX

MicroWindows Open Source Project成立的宗旨在于针对体积小的装置,建立一套先进的视窗环境,在Linux桌面上通过交叉编译可以很容易地制作出micro-windows 的程序。MicroWindows能够在没有任何操作系统或其他图形系统的支持下运行,它能对裸显示设备进行直接操作。这样,MicroWindows就显得十分小巧,便于移植到各种硬件和软件系统上。 OpenGUI

OpenGUI支持多种操作系统平台,比如MS- DOS、QNX和Linux等,不过目前只支持x86硬件平台。OpenGUI分为三层: 最底层是由汇编语言编写的快速图形引擎;中间层提供了图形绘制API,包括线条、矩形、圆弧等,并且兼容Borland的BGIAPI;第三层用C++编写,提供了完整的GUI对象库。OpenGUI比较适合于基于x86平台的实时系统,跨平台的可移植性较差。

总结:各GUI对应的关系

嵌入式GUI种类繁多多,实现原理也不尽相同。在嵌入式Linux中选择GUI系统,如果选择TinyX、Qt/Embedded、GtkFB、MiniGUI,都依赖于设备驱动,也就是说必须先移植LCD的驱动程序。而MicroWindow和OpenGUI是自己直接操作硬件寄存器的,不需另外的驱动,但OpenGUI只能用于X86结构,不能移植到ARM平台。你会选择哪个UI设计你的产品?欢迎给出您的意见。

嵌入式GUI和X86平台GUI的对应关系

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注