通常一个界面库是否有广大的使用人群,我觉得与以下几个因素有关:支持的操作系统是否多样,支持的操作系统市场占有率是否大,使用是否方便,是否有良好的"所见即所得"(WYSIWYG)的开发工具支持,是否有经济实力的雄厚的大公司支持等等。结合我使用过的的几种C++界面库和大家交流一下。
1.MFC(MicroSoft Foundation classes):相信在windows下进行开发的各位同僚们都用过MFC进行界面开发。我记得自己初次接触MFC是大学毕设一个关于数字图像处理的课题,用的IDE是VS 6.0,那时就干了件“重复造*“的事,而且是个大*,那时并不知道VS有生成MFC程序的向导,结果坐在电脑前没黑没白的照着一本参考书上的自动生成代码敲了几天几夜,结果很残酷,没运行起来。着实把我吓了一跳,以为开发软件这么难,现在想想MFC的自动生成代码中的有些语言特性直到现在自己也未必完全了解。之后学习了孙鑫的《VC++深入编程》这才算是对MFC渐渐入了门,但是在此后有相当一段时间内都是对MFC只了解其表,会应用,并不了解其本质。直到看了侯捷老师的《深入浅出MFC》才算是对MFC有了本质的认识。(侯捷老师的写作风格很好,这是我第一次真正喜欢上一本计算机书籍)正如侯捷老师所说,要学习MFC首先要对windows程序的事件驱动特性有所了解,消息的产生,获得,分派,判断,处理;还要了解C++的性质(封装,继承,多态)。之后,侯捷老师又仿真了MFC的六大关键技术:MFC的初始化过程,RTTI(执行时类型识别),动态生成,Persistence(永久留存),消息映射,消息绕行,到此为止,MFC已经被剖析的很彻底和细致了,你也可以掌握MFC的本质了吧!
我的使用体验:支持MFC的IDE我使用过VS 6.0, 2008, 2010,其中 AppWizard,ClassWizard, Resource Editor让我们能够很快的构建一个MFC程序。我觉得用MFC实现简单的UI功能还是很不错的,但是要实现复杂,美观的UI,编码还是过于复杂(其实有很多基于MFC实现的界面库,有较好的界面效果,但其中有些要收费,我使用过的是Codejock.Xtreme.Toolkit.Pro)。用vs6.0 和 vs 2008 生成的MFC程序还要依赖相应的VC组件运行,生成的可执行程序由于包含了大量的库比较大。vs 2010生成的可执行程序只需附带运行时dll就行。
2.WTL(windows 模板库):一个用来开发 Windows 应用程序的 C++ 的 UI 组件,它扩展了 ATL (Active Template Library) 提供了一系列的对话框、帧、GDI对象等等。我们使用的的金山卫士就是用wtl开发的....。
以下引自《WTL for MFC Programmers 》“WTL 具有两面性,它没有MFC的界面(GUI)类库那样功能强大,但是能够生成很小的可执行文件。如果你象我一样使用MFC进行界面编程,你会觉得MFC提供的界面控件封装使用起来非常舒服,更不用说MFC内置的消息处理机制。当然,如果你也象我一样不希望自己的程序仅仅因为使用了MFC的框架就增加几百K的大小的话,WTL就是你的选择。
当然,我们还要克服一些障碍:
1) ATL样式的模板类初看起来有点怪异 ;2) 没有类向导的支持,所以要手工处理所有的消息映射。 3) MSDN没有正式的文档支持,你需要到处去收集有关的文档,甚至是查看WTL的源代码。4) 买不到参考书籍 5) 没有微软的官方支持 6) ATL/WTL的窗口与MFC的窗口有很大的不同,你所了解的有关MFC的知识并不全部适用与WTL。
从另一方面讲,WTL也有它自身的优势:
1) 不需要学习或掌握复杂的文档/视图框架。 2) 具有MFC的基本的界面特色,比如DDX/DDV和命令状态的自动更新功能(译者加:比如菜单的Check标记和Enable标记)。 3) 增强了一些MFC的特性(比如更加易用的分隔窗口)。 4) 可生成比静态链接的MFC程序更小的可执行文件(译者加:WTL的所有源代码都是静态链接到你的程序中的)。 5) 你可以修正自己使用的WTL中的错误(BUG)而不会影响其他的应用程序(相比之下,如果你修正了有BUG的MFC/CRT动态库就可能会引起其它应用程序的崩溃。
如果你仍然需要使用MFC,MFC的窗口和ATL/WTL的窗口可以“和平共处”。
我的使用体验:谈起使用WTL的过程,很早就听说过它的这些特点,出于对新技术的热情,私下里一直在进行学习,使用的书籍就是《WTL for MFC Programmers》,自我感觉用WTL进行开发非常便利。碰巧工作上接触了一个使用WTL开发的开源软件http://infrarecorder.org/,界面功能效果都很不错,重要的是他几乎用到了WTL的各种常见界面实现,而且封装的相当好,我在这个软件上进行了很多基于WTL和COM的扩充开发,让我学习到了不少WTL和COM的开发经验。另外,金山卫士的部分开源代码我们也可以进行学习。开发环境依然是VS系列,可以下载相应的WTL版本作为插件集成入VS。
3.Qt:相比于以上两种界面库,他最大的优点就是跨平台。以下引自开源中国社区“Qt是诺基亚开发的一个跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程。Qt 具有下列优点:
优良的跨平台特性: Qt支持下列操作系统: Microsoft Windows 95/98, Microsoft Windows NT, Linux, Solaris, SunOS, HP-UX, Digital UNIX (OSF/1, Tru64), Irix, FreeBSD, BSD/OS, SCO, AIX, OS390,QNX 等等;
面向对象 Qt 的良好封装机制使得 Qt 的模块化程度非常高,可重用性较好,对于用户开发来说是非常 方便的; Qt 提供了一种称为 signals/slots 的安全类型来替代 callback,这使得各个元件 之间的协同工作变得十分简单;
丰富的 API Qt 包括多达 250 个以上的 C++ 类,还替供基于模板的 collections, serialization, file, I/O device, directory management, date/time 类。甚至还包括正则表达式的处理 功能;
支持 2D/3D 图形渲染,支持 OpenGL;
大量的开发文档;
XML 支持;
我的使用体验:仍然是出于对新技术的热情进行的Qt开发,感觉实现复杂的UI功能和效果比以上两种界面库容易的多,我用的IDE是Qt Creator,很炫,但是感觉运行效率上没VS块(当然是windows平台下的体验),特别是逐步调试推进很慢,有时GCC编译器会无响应(也可以选择windows下的编译器),另外发现一点:数据库操作时,Qt对SQLite的封装执行SQL语句很慢,我测试了一下,在sqlite管理工具中执行一条带表关联和分页的SQL语句需要393ms,但是采用Qt封装的SQLite执行需要1410ms,这数量级可差距大了。(究竟是谁的问题?)
以上讲了三种自己使用过的C++界面库,业界有很多对三种界面库的对比,优点,缺点,适不适合用云云,我觉得在没有经过实际应用的情况下去否定另一种是不公平的,这在某种程度上也反映了我们对技术的保守心态,有些人还会抵触新的技术,我还是认为最好多学几种相关技术,然后在最合适的场景下去应用,比如如果要进行网络分发客户端的情况下我会抛弃MFC而选择WTL,减少网络数据传输量,要是在跨平台场景下我会首选Qt,你懂的。
本文转自永远的朋友博客51CTO博客,原文链接http://blog.51cto.com/yaocoder/780787如需转载请自行联系原作者
yaocoder