MiniGUI V3.0 介绍

MiniGUI是一款面向实时嵌入式系统的轻量级图形用户界面支持系统。MiniGUI 的开发起始于 1998 年底,到现在已历经近十年时间。经过飞漫软件多年的精心打造,MiniGUI已经成为性能优良、功能丰富的跨操作系统嵌入式图形用户界面支持系统。目前,MiniGUI 已经广泛应用于通讯、医疗、工控、电力、机顶盒、多媒体终端等等。使用MiniGUI成功开发产品的企业有华为、中兴通讯、大唐移动、长虹、TCL、联想、迈瑞、南瑞、炬力、D2等。这些用户广泛分部在中国大陆、中国台湾、新加坡、韩国、美国、德国、意大利、印度、以色列等国家和地区。值得一提的是,在中国自主开发的 3G 通讯标准 TD-SCDMA 中,约有 60% 获得入网许可证的 TD-SCDMA 手机使用MiniGUI 作为其嵌入式图形平台,以支撑浏览器、可视电话等 3G 应用软件的运行;其中有海信 T68、中兴通讯 U85 等 TD 手机型号。

在经过长达一年的开发之后,飞漫软件完成了 MiniGUI 最新版本(MiniGUI V3.0)的开发。本文将向读者介绍MiniGUI V3.0 的软件架构及主要功能特性。

MiniGUI 3.0的软件架构

minigui-arch.jpg

如上图所示,从底至上,MiniGUI 由如下几个模块组成:

  • 图形抽象层(Graphics Abastract Layer,GAL)。图形抽象层将来自不同操作系统或设备的图形接口进行抽象,为 MiniGUI 上层提供统一的图形接口。在图形抽象层内,包含有针对 Linux FB 设备、eCos LCD 设备等的软件组成部分。这些软件组成部分通过调用底层设备的接口来实现具体的图形抽象层操作,如打开设备、设置分辨率及显示模式、关闭设备等。我们将这些用于适配图形抽象层接口的软件组成部分称为“引擎(engine)”,其概念和操作系统中的设备驱动程序类似。
  • 输入抽象层(Input Abstract Layer,IAL)。和 GAL 类似,输入抽象层将 MiniGUI 涉及的所有输入设备,如键盘(keyboard)、小键盘(keypad)、鼠标(mouse)、触摸屏(touch screen)等抽象了出来,为上层提供一致的接口。要支持不同的键盘、触摸屏或者鼠标接口,则通过为 IAL 编写不同的输入引擎实现。MiniGUI 通过 IAL 及其输入引擎,提供对 Linux 控制台(键盘及鼠标)、触摸屏、遥控器、小键盘等输入设备的支持。
  • 图形设备接口(Graphics Device Interfaces,GDI)。该模块基于图形抽象层为上层应用程序提供图形相关的接口,如绘制曲线、输出文本、填充矩形等等。图形设备接口中含包含其他比较独立的子模块,如字体字符集(font and charset)支持、图像(image)支持等。
  • 消息处理模块(Messaging Module)。该模块在输入抽象层基础上,实现了 MiniGUI 的消息处理机制,为上层提供了完备的消息管理接口。众所周知,几乎所有的GUI 系统本质上都是事件驱动的,系统自身的运行,以及GUI 应用程序的运行,都依赖于消息处理模块。
  • 多窗口处理模块(Windowing Module)和控件(Control 或 Widget)。基于图形设备接口和消息处理模块,MiniGUI 实现了多窗口处理模块。该模块为上层应用程序提供了创建主窗口和控件的基本接口,并负责维护控件类。控件类是用来实现控件代码重用的重要概念,利用控件类(control class),我们可以创建属于某个控件类的多个控件实例(instance),从而让这些控件实例使用同一个控件类的代码,这样,我们就实现了类似 C++ 那样的类和实例概念,从而可以最大程度上重复利用已有代码,并提高软件的可维护性。MiniGUI 的控件模块实现了常见的 GUI 控件,如静态框、按钮、编辑框、列表框、下拉框等等。
  • 外观支持(Look and Feel)。这个模块是 MiniGUI V3.0 提供给上层应用程序的接口,可用来定制 MiniGUI 窗口、控件的绘制。在 MiniGUI V3.0 之前的版本中,对主窗口和控件的定制能力,还没有被抽离出来形成独立的模块,但我们仍然可以通过配置选项让 MiniGUI 的主窗口、控件具有三种显示风格,分别是:类似 PC 的三维风格(PC3D)、平板风格(FLAT)、流行风格(FASHION)。在 MiniGUI 3.0 中,主窗口和控件的外观可完全由应用程序自行定制,在创建主窗口或者控件时,指定外观渲染器(renderer)的名称,就可以让主窗口或者控件具有各自不同的外观。

以上模块组成了 MiniGUI 的核心(core);在 MiniGUI 接口之上,我们还为应用程序提供若干组件,这些组件分别为应用程序提供某些特殊的功能特性:

  • mGi 是 MiniGUI 的输入法组件,该组件目前提供了软键盘输入法和手写输入法框架,并提供给用户管理输入法的容器,通过这个容器,用户还可以添加自定义的输入法。
  • mGp 是针对 MiniGUI 应用程序的一个打印组件,该组件使用户的 MiniGUI 程序具有打印输出功能,可以将 MiniGUI 程序中的位图或文字输出到打印机去。
  • mG3d 是一个为 MiniGUI 的应用程序提供 3D 接口的组件,通过这些接口,用户可以给自己的应用程序添加三维图像、文字渲染、场景渲染等效果,从而可以具有三维效果的人机界面。

mGUtils、mGPlus 等组件是 MiniGUI V3.0 提供给用户的可选组件,这些组件将为客户提供常见工具窗口接口、高级图形接口功能等。

本文接下来将详细讲述 MiniGUI V3.0 中的新增功能特性。

外观渲染器

MiniGUI 3.0新增功能中最为重要的是外观渲染器(Look and Feel Render,LF RDR)。外观渲染器为用户提供了多种风格的主窗口和控件界面外观风格。应用程序在这几种风格的窗口界面之间进行切换非常容易,只要在创建窗口时传递不同的参数,你就可以变换出不同风格的界面。另外,MiniGUI 还进一步统一了窗口元素的属性,如颜色、尺寸、字体等,通过简单的接口,应用程序就可以方便地控制窗口元素的上述属性。可以说,弹指一挥间,界面就已经切换更改,变化起来,极其容易。

外观渲染器通过控制窗口元素的尺寸、颜色、字体以及图标,来展现不同风格的外观效果。用户还可以根据 MiniGUI 外观渲染器的接口定义自己的外观渲染器。在 MiniGUI V3.0 中,我们提供了四种内建的渲染器。

  1. Flat 外观渲染器,如下图所示。此种风格的窗口界面,线条清晰,简洁,因此适用于单色或者灰度显示屏。因为绘制简单,因此该渲染器占用资源最少,运行速度最快。
    lf-flat.jpg
  2. Classic外观渲染器,如下图所示。这种风格的界面是标准的Windows 95 风格界面,也是最广泛使用的风格了。
    lf-classic.jpg
  3. Skin (皮肤)外观渲染器。上面介绍的外观渲染器基本上都是由代码绘制出来的,具有小巧灵活的特点。但是,在嵌入式应用领域,设备的差别非常大。有些设备,已经具备了非常高的运算性能。在这种情况下,可以考虑使用皮肤外观渲染器来美化界面。皮肤外观渲染器需要一整套和界面相关的图片,因此需要占用一些存储资源。皮肤外观渲染器的最大的特点是允许用户定制界面,用户可以使用自己设计的图片替换系统原有的图片,展现在用户面前的就将是你自己设计的界面效果。下图就是采用标准的 MiniGUI 控件创建的窗口效果,但所有的控件都使用了皮肤外观渲染器,通过为这些使用皮肤外观渲染器的控件指定自己的图片,就可以实现效果绝佳的用户界面。如下图所示。
    lf-skin.jpg
  4. Fashion外观渲染器,如下图所示。此种风格的界面,采用 MiniGUI 3.0 组件 mGPlus 提供的颜色渐变填充技术以及矢量图形技术,因此,可获得非常炫丽的界面效果。
    lf-fashion.jpg

主窗口双缓冲区技术

MiniGUI 3.0 中,我们提供了主窗口的双缓冲区技术。当 MiniGUI 3.0 的主窗口具有双缓冲区时,我们可以在自定义缓冲区中获得整个主窗口的渲染结果。在此基础上,我们可以利用高级 2D 图形接口或者 3D 图形接口获得主窗口的各种特殊显示效果,如推拉切换、翻页切换、卷曲效果等等。

double-buffer.jpg

双向文本的显示与输入

双向文本(BIDI Text)的显示与输入。我们知道,除了大家熟知的从左向右书写的文字(如英语、汉语等)之外,还有许多语言保持从右向左的书写习惯,如阿拉伯文和希伯来文。为了支持这些语言,MiniGUI 3.0中增加了对这两种语言所属字符集的处理,并增加了阿拉伯和希伯来键盘布局映射。从而,实现了对双向文本的输入输出处理。如下图所示。

bidi.jpg

不规则窗口

MiniGUI 3.0 之前,所有的窗口只能是矩形的。MiniGUI 3.0 增加了对不规则窗口的支持,如圆角矩形窗口、非矩形的窗口等。通过使用不规则窗口,能为你的用户界面带来意想不到的效果。下图使用中国地图作为窗口掩码,从而创建了一个复杂的不规则窗口。

nr-window.jpg

字体增强

MiniGUI 3.0 中,飞漫软件发明了一种新的 UNICODE 字体文件格式,称为“UPF”字体。这种字体的最大特点,是便于在多进程环境下使用,从而极大地节约了内存的使用。同时,飞漫软件增强了VBF字体格式,将VBF 字体升级到了3.0,扩大了其能适用的字符集范围,以便支持阿拉伯文等语言文字的显示。

其他增强

MiniGUI 3.0实现了桌面的可定制。通过桌面的外部编程接口,用户可以在桌面放置图标并响应桌面事件,实现类似Windows桌面的界面效果。如下图所示。

desktop.jpg

除此之外,MiniGUI 3.0 还增强了透明控件的实现,使之效率更高,且不依赖于控件的内部实现代码。MiniGUI 3.0 还提供独立的滚动条控件,提供统一的虚拟帧缓冲区程序支持等等。

MiniGUI 3.0 提供的新组件

组件是对MiniGUI功能的扩展和增强。在 MiniGUI 3.0 中,我们提供如下两个新的组件:

  1. mGUtils 组件为用户提供了好几个功能模板,有了这些模板,用户就不用为一些常用的功能,再去编写代码了。本组件提供的功能模板有:
    1. 普通文件对话框:此对话框模板具有文件打开,保存以及另存为功能。有两种外观模式:简洁模式和PC模式。用户只要设置好数据结构FILEDLGDATA,然后调用相关的函数接口,就能执行相应的功能了。使用起来,简洁方便。
    2. 颜色设置对话框:此对话框模板在你需要为应用层客户提供调色板的时候,绝对派的上用场。颜色对话框也分为简洁模式和标准PC模式。用户只要设置好数据结构COLORDLGDATA,然后调用颜色对话框函数接口,就可以获得一个漂亮的颜色配置界面了,获取之易,可谓信手拈来!
    3. 字体设置对话框:此对话框提供了一个和Windows的一模一样字体设置对话框。字体对话框在应用开发中的作用,每个开发者都很清楚。用户首先设置好FONTDLGDATA数据结构,然后调用字体设置函数接口,便可实现字体的设置了。
    4. 信息设置对话框:此对话框提供了一个显示特性信息的对话框模板。有了这个模板,用户就不用为了显示一些弹出信息而专门去写一个对话框了。直接设置好数据结构INFODLGDATA,然后就可以调用模板函数接口显示信息了。
  2. mGPlus 组件是对 MiniGUI 图形绘制接口的一个扩充和增强,主要提供对二维矢量图形和高级图形算法的支持,如路径、渐变填充和颜色组合等:
    1. 路径:路径是由一组有严格的顺序折线和曲线组成的。可以使用路径进行填充和剪切。通过提供对路径的支持,我们可以实现矢量图形的绘画,可以支持对矢量图形的无极缩放,旋转等功能,同时还能对矢量字体提供更好的支持。
    2. 渐变填充:渐变填充是指使用一个颜色线性渐变或者按某个路径渐变的画刷,在某个指定区域,或者路径区域内,或者图形进行填充。有了渐变填充,我们就可以实现更加漂亮的更有立体感的控件了,这后续会有详细介绍。目前MiniGUI实现的渐变方式有弧形渐变填充和线性渐变填充。
    3. 颜色组合:在当今非常重视产品包装的年代里,每一个应用开发者都希望能够开发出非常漂亮精致的用户界面,以获得用户的第一好感。颜色组合可谓是这方面的利器,它能够实现图片之间千变万化的组合,让你的界面获得意想不到的效果。MiniGUI 3.0实现了十二种组合模式。

-- KongMing - 03 Mar 2009

Topic attachments
I Attachment History Action Size Date Who Comment
JPEGjpg bidi.jpg r1 manage 37.9 K 2009-03-03 - 09:53 KongMing  
JPEGjpg desktop.jpg r1 manage 20.1 K 2009-03-03 - 09:52 KongMing  
JPEGjpg double-buffer.jpg r1 manage 24.6 K 2009-03-03 - 09:52 KongMing  
JPEGjpg lf-classic.jpg r1 manage 15.7 K 2009-03-03 - 09:51 KongMing  
JPEGjpg lf-fashion.jpg r1 manage 40.7 K 2009-03-03 - 09:51 KongMing  
JPEGjpg lf-flat.jpg r1 manage 16.5 K 2009-03-03 - 09:51 KongMing  
JPEGjpg lf-skin.jpg r1 manage 21.3 K 2009-03-03 - 09:51 KongMing  
JPEGjpg minigui-arch.jpg r1 manage 78.2 K 2009-03-03 - 09:50 KongMing  
JPEGjpg nr-window.jpg r1 manage 13.3 K 2009-03-03 - 09:52 KongMing  
Edit | Attach | Watch | Print version | History: r3 < r2 < r1 | Backlinks | Raw View | Raw edit | More topic actions
Topic revision: r3 - 2010-02-09 - KongMing
 
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2018 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback