MFC、WTL、WPF、wxWidgets、Qt、GTK、Cocoa、VCL 各有什麼特色?

WTL都算不上什麼Framework,就是利用泛型特性對Win API作了層封裝,設計思路也沒擺脫MFC的影響,實際上用泛型作UI Framework也只能算是一次行爲藝術,這個思路下繼續發展就會變得無法用了,好比 代碼過於複雜,編譯太慢,出錯很差調試等問題難以解決。
並且封裝得也不徹底,仍是隨處可見 HWND HDC之類的東西。
用途主要是寫一些很小的程序,或者做爲其餘UI框架的後端實現部分,好比我寫過一個小框架用來作安裝卸載程序,很是小,其中建立管理窗口部分是用WTL的。

MFC是更高級點的Win API封裝,比WTL封裝完全,很難見到HWND HDC了,也提供了很多實用工具類,好比高級控件,泛型容器,IO訪問,網絡協議等。除此以外,還提供了一些基本框架,好比 Document/View,這就是個MVC的簡化版本,只有MV,可是對於數據的管理,消息的傳遞等又沒有什麼約束,致使Doc/View被用得亂七八糟。尤爲是對事件處理的模型,消息映射是功能簡陋,並且容易出錯的方式,惟一優勢是性能好。 從VC++ 1.X就有MFC了,那時整個UI界的設計思想都比較落後(除了Apple),MFC又揹負了沉重的兼容性包袱,好比vc++ 1.52的MFC程序到了vc2003稍加修改均可以編譯,致使MFC後期沒有什麼發展,就是沿着老的思路完善了些細節,添加了些組件,可是根本性的設計問題沒有改進。

GTK,這個吃了語言的虧,用C寫面向對象實在是痛苦,雖然在思想上比MFC要先進了些,可是寫出來的代碼比MFC要羅嗦不少了。相比MFC,多了Layout的概念,事件處理上有了Signal/slot,雖然用起來很麻煩。

wxWidgets,這個基本就是個跨平臺的MFC,對各個平臺的差別作了抽象,實際上後端大多仍是用平臺原生的API實現,好多控件都是直接用系統原生的。有wxWidgets for GTK+的版本,後端就是GTK+,wxWidgets就是一層殼。這也是wxWidgets的優勢,它編譯出來的程序發行包比較小,性能也不錯。

以上這些就是上世紀90年代的UI Framework技術水平了,至今它們也依然沒有太多進步。
下面來談談21世紀的技術。

Qt,雖然它也是上世紀90年代出現的,可是它在21世紀有了長足的進步。應該說它的起點就比較高,一開始就定位跨平臺,並且不知足於簡單封裝系統API,而是要本身創造出一套完整的API和框架,甚至要代替系統API,因此不只僅是作UI,而是涉及到了APP開發所用到的全部東西,包括網絡,數據庫,多媒體,腳本引擎等。signal/slot是Qt發明的,這是事件通知模型裏C++語言的最佳實現了,甚至我都以爲這該寫進C++標準,估計C++委員會的老頑固們是從不寫GUI的。
早期的QT也是沒有DirectUI的概念的,每個QWidget都對應一個原生窗口,從Qt4.4開始,只有頂層QWidget纔是原生窗口,而Child Widget是Alien Widget,只是個抽象的圖層不對應原生窗口,這就實現了DirectUI的概念,不少圖形效果也就變得可能了,好比窗口層疊透明效果。
在4.8後實現了QPA(Qt Platform Abstraction),這就使移植Qt變得很容易,目前Qt是支持平臺最多的框架沒有之一。
因爲早期受權的問題,Qt對於開源社區不是很友好,致使推廣不太順利,直到它改爲了LGPL方式,若是Qt能早點想開了,恐怕就沒有wxWidgets的生存空間了。
Qt的缺點也是有的,就是太大,不過能夠本身剪裁,我能夠把QT庫剪裁到發行包壓縮後2.5MB。

WPF,微軟在Win Form的思路上走到死衚衕後,終於痛下決心用正確的方法開發UI庫了。21世紀的UI必定是定義出來的,絕對不能是代碼寫出來的,因此有了XAML這個強大的定義工具,不但能夠定義UI佈局,還包括圖形動畫效果,消息響應方式等。配合C#這種優秀的語言,更是如虎添翼。可是問題也很明顯,就是過於龐大,不只開發時要用到龐大的IDE和設計工具,發行的安裝包也十分巨大,因此目前仍是不多有人拿他寫通用軟件客戶端的,大可能是作企業項目時寫專用客戶端。
大概4-5年前吧疼訊曾經用WPF寫了個QQ,可是隻實現了基本功能就已經比C++客戶端大好多了,並且運行緩慢,主要是太吃內存,並且那時WPF的優化還不充分。

最後我想補充下真正的UI庫之王,cocoa。
Apple的成功有不少緣由,其中之一就是cocoa,cocoa理念十分先進,並且出來得早,我都懷疑Qt和WPF有很多思想都是借鑑cocoa的。
定義式的UI,用xib就能夠定義UI的絕大部分細節,並且提供所見即所得的可視化設計工具。
嚴格的MVC,並且定義很是清晰,分工明確。
signal/slot,雖然不叫這個名字,但思想就是,並且真的是拖動鼠標就能connect。
提供了ARC,閉包和反射,給UI開發帶來巨大的便利性,固然這得益於Objective-C這個語言。

再補充下 Borland的OWL和VCL。
我是從Borland C++3.0和Delphi 1.0開始用的,那時的Borland看來頗有前途的,惋惜後來一系列決策失誤致使如今這個公司幾乎消失了,同窗們不要再往這個坑裏跳了。
OWL曾經和MFC是競爭對手,設計思想也差很少,我的感受OWL的API設計更優雅一點,可是在市場上OWL被MFC完全擊敗。
Delphi是神做,它在RAD(快速應用開發)領域長時間沒有對手,直到BS架構取代CS架構。Delphi的特色就是簡單、開發快,單純就寫個基本可用的應用來講,可能至今都沒有比他更快的,可是缺點就是醜,基本大多數Delphi應用都是一大堆控件堆積在一塊兒,很不美觀,另外因爲Pascal語言的限制沒法和現有大量的C/C++代碼融合。雖而後來有C++ Builder,可是Builder裏簡單和快的優勢也消失了。Borland的C++編譯器越作越差,致使後來開源項目都不太願意兼容這個編譯器了。
VCL準確地說不是UI庫,而是一套組件接口規範,相似COM ActiveX。delphi和C++builder都是基於這個規範構建了基礎庫。

UI庫是個很大的話題,夠寫好幾本書來探討的,我這裏就是隨便寫點本身的感覺。
單純討論每一個庫的優劣是沒有意義的,而是要放到具體的應用場景裏來看,每一個庫都有本身擅長的場景。

若是僅在Windows下,追求程序小巧,用WTL,不足的地方本身實現去吧,可是視覺效果就呵呵了。
若是能夠大一點,還要好看點,那就Qt。
若是徹底不在意大小,只要視覺效果華麗,就用WPF,若是把開發工具價格也考慮進來,那麼土豪纔會選WPF呢。
MFC就是個雞肋了,除非你現有的工程師不會用別的,或者有歷史遺留代碼要保持兼容。

若是要求跨平臺,那麼就用Qt,wxWidgets和GTK+跟如今的Qt比起來沒有什麼優點了。

若是是iOS Android,那麼最好用原生UI庫,除非你寫遊戲。c++

參考:http://www.zhihu.com/question/23480014數據庫

相關文章
相關標籤/搜索