上一个教程对MFC的历史已经介绍很多了,那么界面方面该怎么选择呢?
说起界面,那真是百家争鸣。C++里面其他的都好说,像什么XML解析顶多也就十几个著名开源库而已。Office 操作的开源库仅有几个,更可怜的是有个很著名的Office开源库只有JAVA和C#版本,但是木有C++版本o(╯□╰)o。 网络方面、字符串处理方面、多语言方面等等都很少,最重要的是,这些开源库中几乎任何一个都能满足我们的需求,所以确实不需要多少个。
但是界面就不一样了,虽然很多,但貌似目前还没有一个能够让大部分人满意的。那就先介绍一下它们的历史吧(以下描述很多都是凭记忆,若有不对,请小伙伴们指正~O(∩_∩)O~):
一、MFC(Microsoft Foundation Classes):
最开始人们使用win32 API来编程,后来出了MFC,MFC封装了几乎所有的win32 API,并且提供了强大的可视化界面编辑器,所以如果用VC++,基本都是用MFC了,而游戏方面因为有大量的游戏引擎,并且MFC根本满足不了游戏的需求,所以游戏方面一直是win32 API为主。
界面框架最经典的非MFC莫属,而MFC的编译器最经典的非VC6.0莫属。 VC6从1998年就开始发行,打败天下无敌手,到现在15年过去了,依然很多公司在用,与XP、IE6一样令人纠结。早在2003年的时候,很多人就唱衰MFC,说MFC已经死掉了,没人用了,不要再学习了。 的确,自VC6以后,MFC确实没有什么大的变化,因为微软早在2001年的时候就发布了C#,而C#的设计者就是Delphi的作者Hejlsberg,而Delphi所属公司正是被VC6打败的Borland。虽然C#宣称比VC++好上一万倍,也确实比VC++好了不止几个档次,但是10多年过去了,VC++依然被大量使用,至少客户端和游戏是VC++占主角。所以其实不管一门语言多么的被唱衰,多么的过时,只要有大量公司招聘,这就比任何一个强大的语言都要好。比如很多高级语言如Erlang,据说年薪数十万上百万,但是国内有多少公司招? 而VC++尽管被唱衰十几年,却还是有大量公司招聘,所以时间是谣言最好的粉碎机。
当然,Alberl也不是推荐大家都去学VC++,学MFC框架,只是在鼓励已经入行的朋友们。不过VC++的适用范围也越来越窄了,十年前几乎是什么都能做,但现在用VC++的公司基本上是做客户端(正常客户端、外挂、病毒等)、游戏、服务器(据说纯C++居多,只是用VC++编译而已)。如果对这几个方面没兴趣的话,就不要选这方面了。其实VC++现在很大程度上都仅仅只有以下几个作用:
1、C++的编译器而已
2、MFC做界面而已
3、做游戏(DirectX等等,用了游戏引擎后,基本不关VC++什么事了)
4、COM接口(但是这个不分语言,用C#、Delphi等等都可以)
像MFC非界面方面的现在都不推荐用,比如MFC的网络库、文件操作、字符串操作等等(不过Alberl还是比较喜欢CString、CFile之类,正在转型中~O(∩_∩)O~),都推荐用纯C++的库,当然,老的项目就不用管啦~。所以仔细数下来,VC++真正让人难以抛弃的就是MFC的界面那一部分。如果不需要绚丽的界面,就无需再纠结其他界面库了,MFC真的很不错。
二、Delphi
当年微软的强劲对手,不过被微软的VC6完败,之后就没有起来了,虽然现在也一直更新。酷狗之前一直用Delphi做的,不过几年前6.0之后就全部换成了VC++,当时界面效果非常好,引起了一阵热潮,现在酷狗2013的界面也是越来越漂亮了,所以这也印证了Delphi的局限性。而Borland在2008年已经将Delphi卖了,并且从招聘来看,已经没几个公司招Delphi了。所以Delphi就不用考虑了。
不过值得一提的是,现在的Delphi做界面比MFC要方便很多,有容器的概念,也就是控件里面可以有控件,组合起来非常方便,其VCL框架非常不错。拖控件貌似比WinForm还方便?(Alberl只是听一个8年.net经验的同事说的,仅仅是指拖控件哦,因为Delphi自带的控件及样式非常多)
三、.NET(VB、WinForm、WPF)
其中VB是单独的语言和界面框架,也是拖拖控件就OK,比MFC方便,但也有局限性,招聘公司几乎比Delphi还少? 不过其中音速启动是一个很成功的例子。
而WinForm、WPF都是一个框架,他们用的语言都是C#。.net毕竟是微软的亲儿子,比C++和VC++还全能,不仅有JAVA一样的易用性,还有C++的全能性,还比VC++的MFC好用N倍,除了这些以外还可以做网页、还可以开发Wince、windows Mobile、windows phone、win8 Metro,简直就是个万能胶囊(或者变形金刚),其唯一的坏处就是:
1、要装.net库
但是如果不用高级特性的话,只需要几十M的库就行了,并且等XP淘汰后,就基本不用装库了。91手机助手不就是要装运行库么~~~
2、跟微软绑太紧
老是有人觉得跨平台天下无敌,跨平台当然好,跨平台就什么问题都没了? 想想当年的功能机,JAVA游戏要适配多少个手机! HTML要适配多少个浏览器! 那么多跨平台的C++库,几乎覆盖了所有范围,为什么微软还健在? 为什么大型3D游戏几乎都不考虑linux? 为什么QQ、360也不看重linux? 为什么?
所以Alberl想说的是,跨平台这些都是老板关心的事,如果跨平台赚不到钱,谁去跨平台。 不跨平台必死无疑? 杀毒软件有跨平台的吗! 酷狗、酷我、千千、暴风、快播等等,你看看你电脑里的客户端,有几个跨平台的? 连QQ的linux版都不怎么更新,有关注linux的? 如果说这些客户端都是因为太老,跨平台难度大,那百度近两年才开始做客户端,百度影音、百度爱奇艺、百度杀毒等一系列新出来的客户端,哪个跨平台? 如果你的公司能跟上述任何一家公司比,你的水平能跟上述任何一家公司的员工比,那个时候才是我等码农担心跨平台的时候。
所以无论从公司赚钱,还是个人赚钱的方向来看,不跨平台也可以过得很好,真的没必要去担心跨平台。
照旧声明,Alberl不想卷入口水战。该跨平台的就跨平台,不该跨平台的就不用瞎操心了。移动客户端、浏览器当然是必须跨平台,还有很多很多跨平台~~~
3、运行缓慢
其实如果只用WinForm,是感觉不到任何缓慢的。 如果WPF也只用低级特性,也是感觉不出来的。 当然,如果用WPF的高级特性就另当别论了,QQ概念版已经停止开发很久了,而据我那个8年.net经验的同事说,一般C#做客户端还是WinForm用的多,很少用WPF的,所以WPF还有待考验。
其实上面3点的坏处真的没那么夸张,只有第1点可能会影响大点,但是91手机助手不也过得很不错吗?
用.net的公司也是一大片,由于没有权威资料,所以无法和MFC比较,总之学会VC++、.net任何一个,都是不会饿死的。不过值得一提的是,虽然那个同事工作经验8年,而Alberl的经验才2年多(包括在这家公司实习1年),工资却相差不多,甚至还比不上NB的应届生(比如论坛里经常出现的【我同学一毕业】、【我朋友】系列)。不过他是想学习C++,才放低姿态来我们公司,因为C++的公司看他没有C++经验,一般不招。但是如果他找.net的工作,特别是同行业的,那就比【我同学一毕业】系列要好不少啦~O(∩_∩)O~
这也只是代表业内平均水平,不说个别大牛,我们就不要得韩红的病啦~~~
说了这么多,转来转去还是在微软的手掌心,现在安卓这么流行,要是微软真不行了,我们怎么办?
不用担心,微软就算倒闭了,PC端还是有几十亿的,暴雪那一系列显卡杀手游戏还在呢,QQ几亿客户端还在呢,工业设备还在呢,那么多公司还在呢。PC端经过几十年的发展才完善,移动端更需要一个漫长的过渡期,PC端再过个十年没问题,如果什么时候敲代码都不用PC了,那PC真的玩完了。不过我等码农真的不用担心是否被绑在微软,咱还是担心一下年终奖有多少吧,年终奖不给力就担心下一份工作吧,或者担心一下食品安全,担心一下房价吧,搞不好我们转行卖烧饼、烤鱿鱼去了,在我们要担心的列表里面,微软真的是排不上号~O(∩_∩)O~
四、QT
在windows客户端方面,还真的是离不开微软,不过也有做的不错的,像豌豆荚就是自行精简Webkit来做界面,没有实力的小公司就不用学了;WPS(2012及以后的版本)和YY语言都是用QT开发的,很多linux界面也都是QT开发。
其中WPS可是真正的技术活,国内软件竞争这么激烈,模仿QQ、金山卫士、播放器的一大堆,但模仿WPS的真没几个,可见QT也真是不错啊。(多谢xiepeixing的提示)
新版的YY语音跟QQ界面也挺像的,很炫。
QT也是有容器的概念的,可以控件里面放控件,并且有QML来布局界面,很多库也是封装的很好用,最主要它是跨平台的。但是诺基亚2012年把它卖了,前途未卜~
既然有这么多好处,特别是那个跨平台,并且是1991年就出来了,而VC++ 1.0是1992年才出来的,直到VC++ 4.0被认可时,也到了1995年了。并且十几年过去了,VC++从98年之后就没有大的更新,微软早就推广.net去了,直到VS2008出来,变化也不是很大,这中间隔了10年,QT都在发展。但是为啥火的不是QT,而是VC++ ?
这之间的原因Alberl也不知道,但是只知道以下几点:
1、QT带了几十M的dll(目前的版本),所以也是很多公司不太想用的原因,很多公司连MFC都嫌大,改用WTL(当然,WTL除了小,还有其他优势)。
2、跨平台真的不是那么重要。Alberl刚学MFC没多久的时候,就看到很早就有人说MFC死了,QT才是王道,但是QT却在2012年被卖了,2012年诺基亚好歹还不缺钱...
3、开源库不是万能的。 Alberl之前也是以为有开源库就一定不要用商业库,但想想其实这没有任何科学依据,纵使所有的功能都有开源库,但商业库还是依然火爆,真的不是老板人傻钱多。 如果一个曲线控件,一个员工开发一个月就需要上万元,而且还不稳定,各种功能不全,就算在开源控件上面改动,也需要很多精力,有时需要几个月才能搞定,所以花几百甚至几千块买个稳定可靠的控件,真的是只赚不赔。当然了,这是以老板的角度来看,作为码农肯定不能这样想,因为这个不会那个不会,那真的就什么都不会了。 不过有时候有些东西真的不是花时间就能搞的定的,等你搞定的时候说不定早就不适用了。
4、QT自身的一些局限。 由于不是windows原生的界面库,在外观上看起来可能差不多,但是真用起来的话,可能就有很多细节问题和困难了。这点只是道听途说。(不过经网友xiepeixing的提示,WPS2012以后也用QT开发了,加上YY语音,有两款完全不同的商业产品,看来还是不错的。)
突然想起来了,本教程所用的VLC,也是用QT做的,VLC还开发了一个皮肤编辑器,真的很强大。VLC有数十款皮肤,还可以自行编辑皮肤,这是Alberl比较喜欢的一个皮肤:
又查了下资料,根据维基百科和百度百科的资料,以下软件也是QT开发:
KDE
VirtualBox
Google Earth 谷歌地球
Skype
极品飞车
PS Elements(PS的一个小组件)
SMPlayer
Bitcoin 比特币
Doxygen
Opera浏览器
豆瓣播放器
VirtualBox
Google Earth 谷歌地球
Skype
极品飞车
PS Elements(PS的一个小组件)
SMPlayer
Bitcoin 比特币
Doxygen
Opera浏览器
豆瓣播放器
不过Alberl看到Skype、Opera的windows版本和linux版本都是分开下载的,那应该是没用QT开发了吧?(感谢网友【abc19abc91】的指正:Qt是代码级的跨平台,不是2进制跨平台,是需要重新编译的)
五、WTL(Windows Template Library)
WTL的出世是因为微软发现ATL虽然很小,但是要工作起来却要做很多封装,所以在ATL3.0出来之后,就有了WTL,但是没有文档和技术支持,直到2002年2月份,才有了第一份文档。直到2004年才将WTL托管到SourceForge(之前在微软官网可以下载),这时已经是7.5了,2007年6月出了8.0稳定版之后,就基本没有更新了。2007年6月到2013年10月16(本文发布之日),分别在2009、2011、2012年发布了三个8.1版本。
由于没有正式的文档支持,示例代码和资料也远远不如MFC,所以WTL一般都是高手玩的东西,初学者一般都是学MFC那一套玩意。
虽然从2007年之后基本没有大更新,但是用的公司还是很多的,最主要是因为如果要做高级的界面,WTL确实方便很多,另外就是体积小,几K到十K就能做出很漂亮的界面(不过大小现在已经不算很大的优势了,动不动几十M的安装包,真心不用担心MFC默认的那几M)。比较著名的有谷歌浏览器,其windows客户端就是用WTL做的(这个Alberl只是之前查资料的时候看到了谷歌浏览器有WTL的代码,没有具体验证是否全部WTL);其次就是金山,并且开源了金山卫士,顺带就有了金山界面库。其次是魔方,界面也是很漂亮很简洁,工具库也都是几百K的样子。
六、简单总结
这五个界面方向都是非常权威,并且经过验证的,用在项目中绝对没问题,就看码农自己的水平了。那么Alberl来做一个简明的总结:
1、功能最好最强大的,当属微软的亲儿子.NET,而C#语言更是亲儿子中的亲儿子,所以如果XP被淘汰的话,用C#真的是什么都不用愁。
2、历史遗留最多的肯定是MFC了,虽然MFC十年前就被唱衰,但就像IE和XP一样,还是有很大的市场,所以如果已经深入了MFC,就不要迟疑了。学MFC最重要的还是C++基础,还有windows消息机制,以及界面。
3、WTL本来就比较小众,一般是高端码农玩,小公司里应该都是MFC为主,很少有玩WTL的,但是如果想把界面做的更好的话,只有深入进去了,金山界面库值得参考。
4、QT的话,Alberl不怎么了解,但是有YY语言做借鉴,说明也是可以的。
七、举例分析
但是即使使用上面任何一个方向去做界面,想要做出QQ、金山这种界面,依然需要花费大量的时间,更主要的是需要很高的水平,WinForm和WPF可能会方便很多,但也不是随随便便就做得出的。
所以如果从零开始,任何一个框架都是需要做大量工作的,如果一个界面库真的有绝对的优势,那么反过来说就是其他界面库有绝对的劣势,那么其他界面库早就消亡了,但是上述界面库经过十几年甚至二十几年沉淀而来,经过了历史的淘汰和时间的检验,所以真的不能说哪个界面库绝对的好,哪个绝对的坏。唯一最大的区别就是码农自身水平的区别了。
但是这些语言已经有非常多的积累了,所以如果真的做项目,肯定不能重复早轮子,站在巨人的肩膀上才能干更多的事。
十年前,如果能做出一个聊天软件出来,肯定火了,比如QQ;
十年前,如果能做出一个压缩软件出来,肯定火了,比如winRAR;
十年前,如果能做出一个播放器出来,肯定火了,比如暴风影音;
十年前,如果能做出一个优化软件出来,肯定火了,比如超级兔子;
十年前,如果能做出一个浏览器出来,肯定火了,比如傲游;
十年前,如果能做出一个XXX出来,肯定火了,比如XXX;
因为在十多年前,国内基本没什么资料(听网上说的),连学会C语言都是件很NB的事,码农更是和当时的大学生一样值钱,那时候能够做出个软件,肯定非常不容易。但是现在到处都是XXX速成、XXX原理、XXX深入浅出,当然,这些都是入门级资料,离做软件还差得远,重要的是国外的开源库越来越多,几乎所有功能都实现了,而国外的资料也越来越多,所以比起十多年前,做个软件根本就是分分钟的事。
而Alberl学习编程这几年,查到的大部分上好的资料都是国外的(windows和C++方面),而且在2002 -- 2003年左右的,但是如果是国内的话,2013年的资料都比不上国外2003年的。即使很多小伙伴废了很大的力气才做出来,发个帖子截个图炫耀下,居然只有exe下载的软件(或者某个功能),咱们就可以立马找到一个国外十年前的资料,分分钟秒杀这些小伙伴,并且还带源码和详细文档。所以一直觉得国内落后十年真不是夸张!
八、得出结论
所以说到底,往高级方向走,语言已经没有太大区别了,区别大的只是资料和代码的积累、以及个人水平。那么显然是哪个语言的资料多,代码积累多,就用哪个。
其中.NET里面的C#语言是微软大力推广的,也有十多年了,从功能、资料、代码累积方面,无疑是最好的。但是Alberl是学C++的,并且远没有达到【用哪种语言无所谓】的级别,所以自然不能选择.NET,所以纵使C#再强大,Alberl目前也不会用。
而QT Alberl连编译都没做过,根本不懂,并且也没有看到QT有很绝对的优势,所以即使QT再NB,作为一个外行,Alberl目前也不敢贸然使用。
而Delphi早就辉煌不再了,并且酷狗从Delphi转向VC++,更加让人对它没兴趣,所以Alberl也跟风啦~
很显然,就只剩下MFC和WTL了,说到Alberl为什么用MFC,这并不是Alberl经过千挑万选的结果,仅仅是因为老师教的第一门语言是C,第二门是C++,在C++入门得差不多的时候,才开始教JAVA、C#那些,那时候已经先入为主了,所以一直喜欢C++,而C++做界面,当时只知道MFC,所以就入门了MFC,在入门得差不多的时候,才知道原来MFC早就被微软抛弃了,但是C++做界面当时只知道QT,其他的也没听说,在做完一个MFC项目以后,觉得还不错,就继续学了,再然后就实习了,就毕业了,就毕业一年多了,就已经学了三年多了,虽然在学校都是打酱油,但好歹也是做过几个小应用的,比如QQ申请器啦,邮箱登陆、网页注册、计算微积分、播放器啦、五子棋啦~(这些都可以在csdn博客上看到),刚刚说的都是自主做的,学校要求做的就不提了(比如学生管理系统、超市进销存,想起来就好笑~O(∩_∩)O~),所以Alberl学MFC真没什么理由,先入为主而已。
九、做出选择
那么MFC和WTL,也是先接触MFC的,WTL接触的很浅,还没在项目中用过,正在学习中。不过可以知道的是,WTL的积累远没有MFC多,而MFC的积累也没有想象中的多,由于微软把什么都封装好了,所以在入门时期用微软的东西就够了;但是真正做项目时,会发现要学的东西太多了,在这个过程中,查资料是最重要的,很多时候查不查得到资料就决定你做不做的出来,这就是从入门阶段往进阶阶段的一个槛;当你做的越多,学的越多的时候,你就会发现,原来很多东西就是查资料这么“简单”而已。而当你会查资料,并且接触了比较多的时候,就是往高级阶段发展的时候了,这个时候要做一个东西,一想就会有很多种解决方案,就算查不到资料,也会有方法绕过去,总之,普通的用户应用还是没问题的。再往上就是大牛级别了,在精通了windows消息机制以后,可以自己做很多事情,比如自己做一个界面库、工具库等等。
而Alberl是处于进阶阶段,离高级阶段还差得远,离大牛级别更是差得远。Alberl所属的层次应该可以说是码农界人数最多的层次,也就是都需要站在巨人的肩膀上才能快速的完成各种任务。所以如果让Alberl去开发出一个QQ的界面,只能靠BCG、TKP,以及CodeProject了,并且如果要再开发一个金山的界面,恐怕又得从头再来,根本达不到通用的程度。
显然,如果有一个开源库做支持,那么开发QQ、金山的界面就不是个问题啦。遗憾的是,MFC本身并没有这些积累,做界面基本靠自绘,一般都是上Codeproject找找自绘的控件,如果没有,那只好自己做了。而除了WTL以外,并没有其他的C++界面库在windows上有这么权威,所以越来越多的人从MFC转向WTL。但是WTL也没有想象中的那么易用啊,如果同样没有开源库的支持,要开发一个通用库来支持QQ和金山,也是白瞎。所以对于高手来说,语言和框架真不是问题,因为他们什么都能解决;但是对于菜鸟来说,语言和框架也真的不是问题,因为就算换个语言,换个框架,他还是不能解决。总之一句话,没有大牛做开源库的话,一切都白搭。
好在已经有很多大牛早就意识到了这些问题,也有很多大牛做了这些工作,所以我们后面学习的菜鸟就有福啦,后面的教程将会做进一步介绍~O(∩_∩)O~
(写完这篇博客,已经十一点半了,今天就不写代码啦~)