嵌入式Linux 系统中UI( 用户界面) 编程需要图形库的支持,图形库可以看作基本的图形绘制支撑库,在嵌入式Linux 系统中比较出名的有QT3/QT4 、Gtk+2 、MiniGUI 等,QT3/QT4 由QT 公司开发,目前被Nokia 收购;Gtk+2 是开源的图形库,对Linux 提供原生支持;MiniGUI 由北京飞漫公司开发。三者都支持跨平台编译和编程。事实上图形库(GUI )还有很多种,那么如此多的图形库,同时你想图形编程,肯定面临选择的问题,学QT3/QT4 好,还是学Gtk+2 好,学MiniGUI 好,还是学MFC (Windows CE/Mobile 流行图形库),其实这些不是学习图形库的关键,因为不同的库提供的接口API 函数不同,编程语言也不同(MiniGUI 和Gtk+2 使用C 语言、QT3/QT4 和MFC 使用C++ ),编程风格也有很大差异。关键在于学习图形库的核心模块,其实核心模块也不多,主要包括输入控制、输出显示、初级绘图、窗口部件、字库解析和解码、图片解码库 等。
图形库(GUI )核心模块- 输入控制 ,在嵌入式Linux 系统中如果需要用到图形库,输入控制是比较重要的需求,输入控制有几种常用的类型,键盘是其中一个,有些嵌入式系统需要的键盘和PC 机一样,叫Keyboard ,有些需要小键盘如手机,这种通常专业一点的叫法是Keypad ,还有一种是软件键盘,就是在触摸屏上模拟一个键盘(现在智能手机上比较流行),对于图形库来讲键盘有3 个重要的检测量,就是按下(Down) 、弹起(Up )和码字(KeyCode ) ,其中码字和实际的键盘按键一一对应,当然还有特殊,就是组合键;触摸屏是另外一种常用的输入控制,英文名叫TouchScreen ,除了可以模拟一个软键盘,它还可以模拟鼠标(Mouse) ,对于图形库来讲触摸屏有5 个重要的检测量,就是按下(Down) 、弹起(Up )、坐标位置( Axis ) ,单击(Single-clicked) 和双击(Double-clicked) , 目前比较流行手机手势识别(如划拉功能),就是通过这些量的计算和组合来实现的;鼠标(Mouse) 是和触摸屏类似的输入设备,不过在大多数的嵌入式系统中都是用触摸屏来替代鼠标(Mouse) ,所以对于图形库来讲鼠标需要检测的量和触摸屏相同, 也就是说在PC 机上开发嵌入式软件时可以用鼠标模拟键盘。以上嵌入式系统中常用的输入设备,当然还有其它的输入设备,如游戏机操纵杆(Joktick )等都属于比较专用的输入设备了。
图形库(GUI )核心模块- 输出显示 ,如果嵌入式系统没有显示设备,那就不需要图形库(GUI )了,如果用到了图形库(GUI ),添加显示设备就是必须了,嵌入式系统比较常用的显示设备是LCD ,特殊的应用之中也有用CRT 作为显示设备的(如医疗用的监视器),比较而言LCD 最为常用,其实支持CRT 还是支持LCD 是硬件和驱动的事情,对于图形库来讲和输出显示设备最密切的是图象缓冲区(又叫Famebuffer ), 就是说图形库是通过Famebuffer 来显示的,也许Famebuffer 对你来说比较抽象,你可以这么理解,Famebuffer 就是一张白纸,图形库就是带橡皮的铅笔在白纸(Famebuffer )画画,带橡皮的意思是可以在同样的这张白纸上改画的内容,如果用彩笔就可以画彩画了,橡皮也许就要改用涂字液了。除了Famebuffer ,输出显示和图形库相关的还有显示模式,是RGB888 还是ARGB8888 还是RGB565 等, 这些在以后的文章中将做解析。
图形库(GUI )核心模块- 初级绘图层 ,初级绘图层是图形库(GUI )最基础的绘制模块,如果还要找更基础的那就是打点,打点和显示输出设备的的单个像素(Pixel )对应,是图象显示的最小单元,其它的初级绘图都是以打点函数为基础来实现的 ,如画线,画弧、画椭圆、画长方体、画折线、画扇形、绘字、贴图等等都是用打点来实现的。为什么会有初级绘图模块,初级绘图其实是对现实物体的抽象,看看你的周围,物体都是点、线、圆、面组成,看深一点,到分子元字,那个层次,也是点、线、圆、面组成。所以用最基础的绘制原理上是可以实现对现实中各个实物的绘制和模拟的。事实上图形库(GUI )编程的实践也证明也其正确性。
图形库(GUI )核心模块- 窗口部件 ,窗口部件是基于初级绘图的基础实现, 它应需求而生,就是说窗口部件的底层是初级绘图层,窗口部件是初级绘图层的一种封装实现,如果没有窗口部件,你也可以通过初级绘图层来实现编程,不过这将十分的麻烦,所以为了简化UI 编程,就将常用的 一些初级绘图层实现的部件提取出来,划分为另一个层次就是窗口部件层,它实现的东西比较多,常用的有Label 、Button/PushButton 、Combobox 、Checkbox 、RadioButton 、Hbox 、Vbox 、Groupbox 、SpinBox 、Splash 、TextEdit 、LineEdit 等,相关联的有Backgroud 、Border 、Margin 、Frame 、Style 等。窗口部件可以用来实现其它常用的典型窗口如对话框(Dialog )、主窗口(MainWindows) 、文件管理器(FileManager )等等,这些都属于窗口部件的上一层,在嵌入式系统应用中,UI( 用户界面) 集中在窗口部件的改造、封装和应用上,因为初级绘图层太基础,而之上的的已实现的Dialog 、MainWindows 、FileManager 往往是不能满足需求的 ,所以需要设计自己的差异化的满足实际需求的Dialog 、MainWindows 和FileManager 等等。只有这样才能做出漂亮的界面,最主要是和别人不同(差异化)。
图形库(GUI )核心模块- 字库解析和解码 ,图形库比较总要的另外的模块是字库解析和解码,世界上有多个国家,采用的文字不一样,如何兼容和显示不同的文字(对应不同的字库)就需要用到字库解析和解码,就是说要显示中文就需要中文字库和中文字库解析与解码器,如过要显示英文,就需要英文字库和英文字库解析与解码器,要显示日、韩文就需要日、韩字库和日、韩字库解析与解码器。专业的叫法是国际化和本地化,就像一个会说各种语言的人,不同的场合说不同的语言,字库解析和解码就做同样的事情。
图形库(GUI )核心模块- 图片解码库 ,图片解码库是图形库(GUI )重要的组成模块,图形除了形就是图,所以图的处理是图形库的非常重要组成,图就是图片,在现实世界里图片存在着格式的差异,比较流行的格式用Bitmap 、Jpeg 、Png 、Gif 、Tiff 等,为了支持一个格式必须提供这种格式图片的解码器。图片解码库最常用的有两个方向,一个是用于实现图片浏览器,另外是用于帖图,目的是优化界面,使之显示的漂亮美观。
学习UI (用户界面)编程就需要学好图形库,而学好图形库不在于学习MFC 还是学习QT3/QT4 或者学习Gtk+2 ,而在于学习图形库的基础实现核心模块,知道图形库能干什么,怎样才能干什么才是UI (用户界面)编程的灵魂。
(作者 冯青华 信庭嵌入式工作室(www.xteda.com)- CEO )