上一個教程對MFC的歷史已經介紹不少了,那麼界面方面該怎麼選擇呢?
提及界面,那真是百家爭鳴。C++裏面其餘的都好說,像什麼XML解析頂多也就十幾個著名開源庫而已。Office 操做的開源庫僅有幾個,更可憐的是有個很著名的Office開源庫只
有JAVA和C#版本
,可是木有
C++版本
o(╯□╰)o。 網絡方面、字符串處理方面、多語言方面等等都不多,最重要的是,這些開源庫中幾乎任何一個都能知足咱們的需求,因此確實不須要多少個。
可是界面就不同了,雖然不少,但貌似目前尚未一個可以讓大部分人滿意的。那就先介紹一下它們的歷史吧(
如下描述不少都是憑記憶,如有不對,請小夥伴們指正~O(∩_∩)O~
):
1、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++如今很大程度上都僅僅只有如下幾個做用:
一、C++的編譯器而已
二、MFC作界面
而已
三、作遊戲(DirectX等等,用了遊戲引擎後,基本不關VC++什麼事了)
四、COM接口(可是這個不分語言,用C#、Delphi等等均可以)
像MFC非界面方面的如今都不推薦用,好比MFC的網絡庫、
文件操做、字符串操做
等等
(不過Alberl仍是比較喜歡CString、CFile之類,正在轉型中
~O(∩_∩)O~
),都推薦用純C++的庫,
固然,老的項目就不用管啦~
。因此仔細數下來,
VC++
真正讓人難以拋棄的就是MFC的界面那一
部分。若是不須要絢麗的界面,就無需再糾結其餘界面庫了,MFC真的很不錯。
2、Delphi
當年微軟的強勁對手,不過被微軟的VC6完敗,以後就沒有起來了,雖然如今也一直更新。酷狗以前一直用Delphi作的,不過幾年前6.0以後就所有換成了VC++,當時界面效果很是好,引發了一陣熱潮,如今酷狗2013的界面也是愈來愈漂亮了,
因此這也印證了Delphi的侷限性。而Borland在2008年已經將Delphi賣了,而且從招聘來看,已經沒幾個公司招Delphi了。因此Delphi就不用考慮了。
不過值得一提的是,如今的Delphi作界面比MFC要方便不少,有容器的概念,也就是控件裏面能夠有控件,組合起來很是方便,其VCL框架很是不錯。拖控件貌似比WinForm還方便?(Alberl只是聽一個8年.net經驗的同事說的,僅僅是指拖控件哦,由於Delphi自帶的控件及樣式很是多)
3、.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,
簡直就是個萬能膠囊(或者變形金剛),其惟一的壞處就是:
一、要裝.net庫
可是若是不用高級特性的話,只須要幾十M的庫就好了,而且等XP淘汰後,就基本不用裝庫了。91手機助手不就是要裝運行庫麼~~~
二、跟微軟綁太緊
總是有人以爲跨平臺天下無敵,跨平臺固然好,跨平臺就什麼問題都沒了? 想一想當年的功能機,JAVA遊戲要適配多少個手機! HTML要適配多少個瀏覽器! 那麼多跨平臺的C++庫,幾乎覆蓋了全部範圍,爲何微軟還健在? 爲何大型3D遊戲幾乎都不考慮linux? 爲何QQ、360也不看重linux? 爲何?
因此Alberl想說的是,跨平臺這些都是老闆關心的事,若是跨平臺賺不到錢,誰去跨平臺。 不跨平臺必死無疑? 殺毒軟件有跨平臺的嗎! 酷狗、酷我、千千、暴風、快播等等,你看看你電腦裏的客戶端,有幾個跨平臺的? 連QQ的linux版都不怎麼更新,有關注linux的? 若是說這些客戶端都是由於太老,跨平臺難度大,那百度近兩年纔開始作客戶端,百度影音、百度愛奇藝、百度殺毒等一系列新出來的客戶端,哪一個跨平臺? 若是你的公司能跟上述任何一家公司比,你的水平能跟上述任何一家公司的員工比,那個時候纔是我等碼農擔憂跨平臺的時候。
因此不管從公司賺錢,仍是我的賺錢的方向來看,不跨平臺也能夠過得很好,真的不必去擔憂跨平臺。
照舊聲明,Alberl不想捲入口水戰。該跨平臺的就跨平臺,不應跨平臺的就不用瞎操心了。移動客戶端、瀏覽器固然是必須跨平臺,還有不少不少跨平臺~~~
三、運行緩慢
其實若是隻用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~
4、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也不知道,可是隻知道如下幾點:
一、QT帶了幾十M的dll(目前的版本),因此也是不少公司不太想用的緣由,不少公司連MFC都嫌大,改用WTL(固然,WTL除了小,還有其餘優點)。
二、跨平臺真的不是那麼重要。Alberl剛學MFC沒多久的時候,就看到很早就有人說MFC死了,QT纔是王道,可是QT卻在2012年被賣了,2012年諾基亞好歹還不缺錢...
三、開源庫不是萬能的。 Alberl以前也是覺得有開源庫就必定不要用商業庫,但想一想其實這沒有任何科學依據,縱使
全部的功能都有開源庫,但商業庫仍是依然火爆,真的不是老闆人傻錢多。 若是一個曲線控件,一個員工開發一個月就須要上萬元,並且還不穩定,各類功能不全,就算在開源控件上面改動,也須要不少精力,有時須要幾個月才能搞定,因此花幾百甚至幾千塊買個穩定可靠的控件,真的是隻賺不賠。固然了,這是以老闆的角度來看,做爲碼農確定不能這樣想,由於這個不會那個不會,那真的就什麼都不會了。 不過有時候有些東西真的不是花時間就能搞的定的,等你搞定的時候說不定早就不適用了。
四、QT自身的一些侷限。 因爲不是windows原生的界面庫,在外觀上看起來可能差很少,可是真用起來的話,可能就有不少細節問題和困難了。這點只是道聽途說。(不過經網友xiepeixing的提示,WPS2012之後也用QT開發了,加上YY語音,有兩款徹底不一樣的商業產品,看來仍是不錯的。)
忽然想起來了,本教程所用的VLC,也是用QT作的,VLC還開發了一個皮膚編輯器,真的很強大。VLC有數十款皮膚,還能夠自行編輯皮膚,這是Alberl比較喜歡的一個皮膚:
又查了下資料,根據維基百科和百度百科的資料,如下軟件也是QT開發:
KDE
VirtualBox
Google Earth 谷歌地球
Skype
極品飛車
PS Elements(PS的一個小組件)
SMPlayer
Bitcoin 比特幣
Doxygen
Opera瀏覽器
豆瓣播放器
不過Alberl看到Skype、Opera的windows版本和linux版本都是分開下載的,那應該是沒用QT開發了吧?(感謝網友【
abc19abc91】的指正:Qt是代碼級的跨平臺,不是2進制跨平臺,是須要從新編譯的)
5、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(本文發佈之日),分別在200九、20十一、2012年發佈了三個8.1版本。
因爲沒有正式的文檔支持,示例代碼和資料也遠遠不如MFC,因此WTL通常都是高手玩的東西,初學者通常都是學MFC那一套玩意。
雖然從2007年以後基本沒有大更新,可是用的公司仍是不少的,最主要是由於若是要作高級的界面,WTL確實方便不少,另外就是體積小,幾K到十K就能作出很漂亮的界面(不過大小如今已經不算很大的優點了,動不動幾十M的安裝包,真心不用擔憂MFC默認的那幾M)。比較著名的有谷歌瀏覽器,其windows客戶端就是用WTL作的(這個Alberl只是以前查資料的時候看到了谷歌瀏覽器有WTL的代碼,沒有具體驗證是否所有WTL);其次就是金山,而且開源了金山衛士,順帶就有了金山界面庫。其次是魔方,界面也是很漂亮很簡潔,工具庫也都是幾百K的樣子。
6、簡單總結
這五個界面方向都是很是權威,而且通過驗證的,用在項目中絕對沒問題,就看碼農本身的水平了。那麼Alberl來作一個簡明的總結:
一、功能最好最強大的,當屬微軟的親兒子.NET,而C#語言更是親兒子中的親兒子,因此若是XP被淘汰的話,用C#真的是什麼都不用愁。
二、歷史遺留最多的確定是MFC了,雖然MFC十年前就被唱衰,但就像IE和XP同樣,仍是有很大的市場,因此若是已經深刻了MFC,就不要遲疑了。學MFC最重要的仍是C++基礎,還有windows消息機制,以及界面。
三、WTL原本就比較小衆,通常是高端碼農玩,小公司裏應該都是MFC爲主,不多有玩WTL的,可是若是想把界面作的更好的話,只有深刻進去了,金山界面庫值得參考。
四、QT的話,Alberl不怎麼了解,可是有YY語言作借鑑,說明也是能夠的。
7、舉例分析
可是即便使用上面任何一個方向去作界面,想要作出QQ、金山這種界面,依然須要花費大量的時間,更主要的是須要很高的水平,
WinForm和WPF可能會方便不少,但也不是隨隨便便就作得出的
。
因此若是從零開始,任何一個框架都是須要作大量工做的,若是一個界面庫真的有絕對的優點,那麼反過來講就是其餘界面庫有絕對的劣勢,那麼其餘界面庫早就消亡了,可是上述界面庫通過十幾年甚至二十幾年沉澱而來,通過了歷史的淘汰和時間的檢驗,因此真的不能說哪一個界面庫絕對的好,哪一個絕對的壞。惟一最大的區別就是碼農自身水平的區別了。
可是這些語言已經有很是多的積累了,因此若是真的作項目,確定不能重複早輪子,站在巨人的肩膀上才能幹更多的事。
十年前,若是能作出一個聊天軟件出來,確定火了,好比QQ;
十年前,若是能作出一個壓縮軟件出來,確定火了,好比winRAR;
十年前,若是能作出一個播放器出來,確定火了,好比暴風影音;
十年前,若是能作出一個優化軟件出來,確定火了,好比超級兔子;
十年前,若是能作出一個瀏覽器出來,確定火了,好比傲遊;
十年前,若是能作出一個XXX出來,確定火了,好比XXX;
由於在十多年前,國內基本沒什麼資料(聽網上說的),連學會C語言都是件很NB的事,碼農更是和當時的大學生同樣值錢,那時候可以作出個軟件,確定很是不容易。可是如今處處都是XXX速成、XXX原理、XXX深刻淺出,固然,這些都是入門級資料,離作軟件還差得遠,重要的是國外的開源庫愈來愈多,幾乎全部功能都實現了,而國外的資料也愈來愈多,因此比起十多年前,作個軟件根本就是分分鐘的事。
而Alberl學習編程這幾年,查到的大部分上好的資料都是國外的(windows和C++方面),並且在2002 -- 2003年左右的,可是若是是國內的話,2013年的資料都比不上國外2003年的。即便不少小夥伴廢了很大的力氣才作出來,發個帖子截個圖炫耀下,竟然只有exe下載的軟件(或者某個功能),我們就能夠立馬找到一個國外十年前的資料,分分鐘秒殺這些小夥伴,而且還帶源碼和詳細文檔。因此一直以爲國內落後十年真不是誇張!
8、得出結論
因此說到底,往高級方向走,語言已經沒有太大區別了,區別大的只是資料和代碼的積累、以及我的水平。那麼顯然是哪一個語言的資料多,代碼積累多,就用哪一個。
其中.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真沒什麼理由,先入爲主而已。
9、作出選擇
那麼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~
(寫完這篇博客,已經十一點半了,今天就不寫代碼啦~)