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

stpeace發表於2017-12-13

       轉自:https://www.cnblogs.com/findumars/p/4204416.html


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庫,除非你寫遊戲。


相關文章