开发者社区> 科技探索者> 正文

浅谈工作中使用过的几种C++界面库

简介:
+关注继续查看
   通常一个界面库是否有广大的使用人群,我觉得与以下几个因素有关:支持的操作系统是否多样,支持的操作系统市场占有率是否大,使用是否方便,是否有良好的"所见即所得"(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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如此之乱的思绪,如何才能专心工作?
      最近的思维特别的乱,乱得乱七八糟的。写一下也许能好一点点。 女朋友(难找哇) 谈恋爱(花钱呀) 见父母(不好过关呀) 买房子(没钱呀) 生小孩(养不起呀) 买奶粉(国内的有毒,国外的太贵) 欧洲弄一个告诉粒子流的对撞,不知道会装出个什么结果。
895 0
不要在疲惫中工作
我不是一个成功的人,我的观点只是我认为的观点,不一定是最好的观点。 累的时候,就要停止干活,去睡觉最好。如何成功?请多睡一会。 不要让自己疲惫不堪的精神,去磨灭对做事的激情。保持以充沛的精力去干自己最喜欢的事。
547 0
工作中遇到的问题总结1
问题(1): LINQ To Object 注意区分大小写。         var caseRefundList = entity.UP_refund_Info_CaseAPIRefund_GetList(accountName.
646 0
分享几个工作中实用的代码优化技巧!
前言之前分享一篇代码优化的文章:条件语句的多层嵌套问题优化,助你写出不让同事吐槽的代码!今天再次分享一些我日常工作中常用的代码优化技巧,希望对大家有帮助!文章首发在公众号(月伴飞鱼),之后同步到个人网站:xiaoflyfish.cn/觉得有收获,希望帮忙点赞,转发下哈,谢谢,谢谢正文类成员与方法的可见性最小化举例:如果是一个private的方法,想删除就删除如果一个public的service方法,或者一个public的成员变量,删除一下,不得思考很多。使用位移操作替代乘除法计算机是使用二进制表的位移操作会极大地提高性能。<< 左移相当于乘以 2;>> 右移相当于除以2,但它会忽略符号位,空位
78 0
2020.07 G2 工作小结
? 修复的一些问题 修复 interval 下 shape='line' 设置 lineCap: 'round' 样式失效 Tip: 可用于进度条的绘制,相比于市面上现有的前端进度条组件,可以做到大小的自适应。 chart .interval() .position('const*value') .shape('line') .style({
224 0
工作
       目前在学生大本营里,我也观察到,很多二本,三本的同学,在心里上有种自卑感,总觉得考分低了,出来就低人一头。这点,我是万万不赞同的。很多时候,我对小弟讲,我相信你们的老师,师兄,师姐,前辈,都有讲过:“大学毕业,仅仅是开始,不是结束。
1155 0
工作中的一些知识总结
跳转 跳转登陆页 if(HybridMethod.isApp()) { RainbowBridge.callMethod('JsInvokeAppScope', 'goLogin'); } else { var _index = window.
1909 0
最近工作
最近的工作忙且乱,以至于,我第天早晨早早起来到晚上11点多才能回到家。今天早晨写代码的时候腰突然猛疼,疼的我直叫唤。躺在床上半天起不来。 最近每天的工作要计划一下了,不能客户说干嘛就干嘛,这样累坏了自己,却还是活干不完。
743 0
工作有感
     到了毕业前夕,大家都忙着找工作,我也不例外.记得来来回回面试了二十多家公司,面试的过程中的确成长了不少.  首先我是计算机专业的,早期怀着成为牛逼程序员的梦想通宵学技术,前前后后学了不少东西.但是现在看来却是很滑稽,我去了一家我挖没想到能去的游戏公司,做着一个从来没学过的C#方向。
1134 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
对象的生命期管理
立即下载
继承与功能组合
立即下载
C++课程-对象模型
立即下载