Windows客户端开发简介(二)
一个典型的Windows客户端程序要有哪几部分构成呢?下面我会以一个国内比较流行的互联网客户端程序的基本架构来跟大家逐步展开分析,由于涉及到知识产权的问题,请大家不要问我是什么产品,当然,如果你能猜到,那我就管不着了^_^。
某视频影音互联网PC客户端产品基本架构
如上只是个粗略的分层架构图,没有更细致的划分,但是有几个地方是需要特别关注的,比如最上层的那几个部分,音视频解码引擎,UI引擎,WebKit浏览器内核,内核通信模块,日志系统。
因为音视频解码引擎和内核通信模块只是对于视频客户端和P2P通信特有的,不具有通用性,所以我这里不做特别介绍。
首先我们要来重头介绍一下UI引擎
所谓的UI引擎就是通常所说的界面库,对于客户端产品来说,UI开发占了很大篇幅,UI的好坏会直接影响用户的最直观体验,因此一个好的界面库实在是重中之重。
那么什么样算是好的UI引擎呢?从功能角度说首先配置方便,能快速的修改界面,或者完成界面的重建;其次要有功能丰富的控件,能够满足各种各样的UI需求。从技术角度说,界面库的移植性要好,比如绘制层和展现层分离,这样在跨平台的时候就只需要修改绘制层的代码,而上层的客户端UI代码不需要做太大修改。其次伸缩性,伸缩性好在界面库本身控件不够丰富的情况下可以快速的进行开发新控件,这里面就跟面向对象技术有很大关系。再其次,UI界面库应该有比较好的扩展性,比如在现有控件不足的情况下,可以直接与平台原生控件结合,这样在界面控件元素缺少的情况下可以快速的利用本平台原生控件进行弥补。
现在的界面库发展大致经历了四个阶段
一、最早的用Windows API进行界面开发的阶段
这时期的界面相对比较简单,图片还用的比较少,软件结构也不是特别复杂,因而这个阶段上界面甚至还谈不上独立出来的引擎,基本和数据层和通信层是整合在一起的。
在这个阶段上,如果你要创建一个窗口,需要调用一大堆的Windows API,需要手动创建消息循环,需要调用诸如CreateWindow这样的API并进行相应的消息处理。
二、以MFC、WTL为代表的第二代界面库
这个阶段上由于面向对象技术的发展(主要是C++),Windows平台上出现了像MFC这样的C++封装界面库。它的主要特点是利用了C++的多态,封装等C++特性,比如把窗口进行封装,把窗口视作一个对象,对窗口的处理视作施加在窗口类对象上的行为。虽然引入了面向对象的概念,但是本质上而言,这还是一种用代码来拼凑界面的办法,对UI开发人员还是有比较高的要求的。
在这个阶段上,如果你要创建一个窗口,相对工作量要少一点,派生两个类,消息循环已经封装在里面,覆盖它们的虚函数,在里面做一些初始化操作就可以了。
三、以QT为代表的第三代界面库
QT使用了一种用QML这种描述性脚本语言配置界面的办法,这种开发界面的方法在效率上与前面两代产品有很大的提高,学习成本也低了很多。
在这个阶段上,如果你要创建一个窗口,只需要在QML的编辑器中进行可视化的创建修改就可以了,QT会编译相应的QML文件到你的应用程序中,某种程度上说,你甚至不需要懂C++也可以完成界面的基本开发。
四、以XML配置为特征的第四代界面库
在Windows平台上,有WPF,Silverlight这样的技术,也有XUL(FireFox所采用的UI引擎)这样的界面库。现在很多的国产界面库也算作是这种类型,比如最近比较流行的DUILIB。它们的主要特征是:界面开发与逻辑控制相分离,用XML来配置界面,XML的一个节点一般就是一种控件,节点上的各个属性控制控件的各种特征,比如位置,图片等等。而用另外一种语言作为对界面元素处理的逻辑控制,比如XUL用脚本语言JavaScript,WPF,Silverlight用C#,DUILIB则直接用了C++。
这个阶段上,如果你要配置一个窗口可能只需要在XML(WPF和Silverlight是XAML)里声明一个元素,比如
<window x=”0” y=”0” width=”400” height=”300” background=”bg.png”></window>
类似于上面这样的一句简单描述,就完成了一个位于屏幕左上角(0,0)起始位置,宽度为400,高度为300,背景图片是bg.png的窗口的配置,注意这里说的是配置,而不是创建,因为创建需要在UI引擎解析完XML以后才会完成。
其实界面库的发展跟计算软硬件技术的发展有着很大关系,随着软件复用性的提高,UI元素的复用性也在不断提高。随着硬件技术的发展,更快的CPU,更大的内存,使得我们在做一些以前看上去效率比较低的处理界面的方式也具有相对良好的性能,但是又同时拥有了更好的灵活性。
现在的互联网客户端一般都会有自己的界面库,也有可能采用一些开源的界面库自己修改。据我说知QQ用的是自己开发的界面库,PPS用的是DUILIB,最近翻了一下新出的微信PC客户端,里面居然也有DUILIB的授权文件,因为界面库的开发算是客户端开发里相对比较有技术含量的东西,因而难度也相对大一点,能流行开的第四代C++界面库其实并不多,如果大家有兴趣可以自行研究。
第二篇就到这里,再往后我要介绍一下Windows界面开发的基础,就是GDI这个东西,还会简单介绍一下GDI的常见函数和使用方法,以及常见的坑。
多谢观赏!