C++UI框架


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM