古詩詞大全網 - 古詩大全 - MFC,WTL,WPF,wxWidgets,Qt,GTK 各有什麽特點

MFC,WTL,WPF,wxWidgets,Qt,GTK 各有什麽特點

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