UI技术简介
- 作者: luckzj
- 发表时间: 2011年10月20日
- 本文链接: http://www.soft-bin.com/html/2011/10/20/ui_tech_intro.html
- copy right (c) http://soft-bin.com all right reserved.
- 转载请注明出处
1. 本文简介
开发一款桌面应用软件,界面设计往往需要占据较大部分的工作量。界面设计的好坏,直接决定了软件的客户体验。然而界面设计是一门专业的技术,需要对Windows界面绘制技术有较深的理解,才可以制作出美观大方的界面效果。
本文主要介绍当前主流的界面设计技术DirectUI,将DirectUI技术与传统的界面设计技术进行比较,最后介绍当前DirectUI技术在国内的发展现状。
2. 传统的UI设计模式
2.1 Windows窗体
Windows界面程序中,最重要的概念是窗体的概念。窗体是Windows程序中,消息派发的单位,每个窗体都有自己的窗口过程,用于处理Windows派发来的消息,这些消息中,比较容易让人理解的,即是WM_ERASEBKGND消息和WM_PAINT消息。
当窗体需要重新绘制背景时,系统就会向窗体发送WM_ERASEBKGND消息,窗体接收到这个消息以后,将会调用OnEraseBkgnd函数,刷新窗体的背景。
当窗体需要被重新绘制时,系统会向窗体发送WM_PAINT消息,则窗体的OnPaint函数将会被调用,以达到重新绘制整个窗体的作用。
我们不需要纠结于绘制背景和绘制窗体的区别,只需要知道窗体大概就是这样展现出来的即可,而两个消息的响应函数,也并非一定是OnEraseBkgnd和OnPaint,我们可以根据需要自行决定函数名称。
我们将某个窗体从后台移动到前台时,则该窗体将会依次收到WM_ERASEBKGND和WM_PAINT消息。
2.2 使用Windows API来制作界面
如果纯粹使用Windows API来开发程序界面,则我们需要做的工作大致如下:
1. 设置一个WNDCLASSEX结构,使用这个结构来注册一个新的窗体类别。
2. 创建刚注册的窗口类别的一个窗体实例。
3. 编写一个窗体过程函数,响应第2步中创建的窗体的各种消息。对于不需要特殊处理的消息,则直接调用DefWindowProc处理。
后续的界面处理,有两种选择,一种是再创建子窗体,放在主窗体上,而后子窗体可以有自己的窗体过程函数,以此实现将界面划分不同模块,分开处理。另外一种选择则是将主窗体划分为不同的区域,在OnPaint函数中,根据不同的区域,调用不同的绘制模块,来实现复杂的界面处理。前者可以认为是MFC的雏形,而后者则是DirectUI的思想。
2.3 MFC框架
MFC是微软提供的一套界面开发工具库,其全称是Microsoft Foundation Classes。早期的界面开发很多是基于MFC框架。
MFC将对窗体操作的一系列Windows API函数封装成一个CWnd类。封装窗口过程处理函数,提供消息映射机制。即不再需要编写窗口过程,而是直接使用消息映射宏ON_MESSAGE(msg, handler)来映射msg与handler。
框架提供从CWnd类派生的诸多其他控件类,例如CButton, CStatic, CListCtrl, CCombox, CProgressCtrl等等。每一个界面控件的实例,都包含一个窗体,可以响应发送给该窗体的消息,多个界面控件,以父子控件的层级关系,搭建在一起,就组成了复杂的界面。
MFC框架中提供的基础控件,往往难以满足复杂界面的需求,通常情况下,软件公司会对MFC库进行扩展,并建造自己的界面控件库,以满足不同的需求。
3. DirectUI技术
MFC的框架经过多年的发展,已经比较完善,但仍然难以使用MFC开发出复杂炫丽的客户界面。很多情况下,界面开发人员都需要根据自己的界面需求,定制开发新的MFC控件,使得界面开发仍然苦难。此外,在MFC框架中,每一个控件都是一个窗体,系统对于窗体的维护需要付出较大的代价,使得程序运行效率低下。
在这种情况下,出现了DirectUI的思想。
2.1 DirectUI简介
DirectUI技术的精髓在于整个程序只有一个窗体,在主窗体上绘制出不同的控件。DirectUI中也有界面控件的概念,但此处的控件,仅仅保存控件区域,并负责对此区域进行自定义的绘制。
采用DirectUI设计界面和MFC设计界面的一大不同之处在于,在MFC中,界面的设计需要通过使用MFC的资源编辑器或者手工编写代码实现。而在DirectUI技术中,界面的设计则是采用xml配置文件的形式。界面xml的配置类似于使用html编写网页。
2.2 DirectUI的实现
DirectUI的实现有多种方式,但基本上大体分为以下几个部分:
1. DirectUI框架:封装窗体功能,消息分发功能,控件基类,皮肤基类,皮肤解析等等
2. 工具封装:封装常用工具,例如字符串处理,XML文件处理等
3. 界面解析引擎:用于解析界面xml配置
4. 界面库: 封装常用的界面库,使得DirectUI可以运行起来
DirectUI框架负责将xml界面配置转换成用户界面,并提供一系列常用界面控件。DirectUI库的使用者,可以使用xml快速配置界面,并通过响应界面控件向外发出的消息,来实现自身的业务逻辑。
不同的公司对DirectUI的实现略有不同,但总体思路大体相当。国内有一些公司,在DirectUI的基础上进行了扩展,使得其功能更加强大。
3. 国内DirectUI的发展
3.1 UIPower公司
提到国内DirectUI技术的发展,就不能不说UIPower公司,其中文名位上海勇进公司。UIPower公司是目前国内最大的DirectUI技术提供厂商之一,发展迅速,有比较多的成功案例。
UIPower对DirectUI技术进行了扩展,这些扩展主要包括以下几个方面:
1. 在DirectUI的核心基础上,封装一层COM,使得其核心控件能够被多种语言访问到。其中最突出的是使用javascript语言访问DirectUI核心控件的接口,使得UIPower公司提供的DirectUI库可以支持使用javascript对界面进行控制。
2. 提供强大的界面设计工具,利用所见即所得的模式,设计用户界面,并自动生成界面xml文档。设计工具中,还提供使用javascript脚本对界面效果进行控制。
3.2 DUILib
DUILib是国内的开业DirectUI项目。DUILib项目基于几千年一个老外写的DirectUI论文中的一个例子。DUILib的发起者基于该例子,创建了完整的DirectUI库,并与2010年发布了第一版开源软件。
DUILib支持DirectUI的所有特性,也提供界面设计器,但由于开发人手不足,界面设计器功能简单,且不完善。目前,该项目仍在继续发展当中。
3.3 bkwin
Bkwin是金山软件公司的界面库,随着金山公司将金山卫士项目源码公开,并建立金山开源社区,bkwin作为金山公司界面库也被开放出来。
Bkwin基于wtl编写,源码小巧,功能强大,支持皮肤设置,语言设置等。实现了DirectUI技术的全部功能。Bkwin不提供界面设计器,只支持纯手工编写界面配置文件。开发者在配置了界面描述、皮肤描述、风格描述以及语言描述四个xml文件后,即可生成用户界面。
Bkwin界面库已经成功应用在金山卫士软件上,且其背后有金山软件公司的支持,因此相对于DUILib更加稳定可靠。
