1. 程式人生 > >淺談工作中使用過的幾種C++介面庫

淺談工作中使用過的幾種C++介面庫

**個人對本文的理解:
C++的介面庫有三種。如果在只在window下做一個工具介面,選用MFC;如果介面需要通過網路釋出出去,可選WTL(windows模板庫);如果需要跨平臺,首先Qt**

通常一個介面庫是否有廣大的使用人群,我覺得與以下幾個因素有關:支援的作業系統是否多樣,支援的作業系統市場佔有率是否大,使用是否方便,是否有良好的”所見即所得”(WYSIWYG)的開發工具支援,是否有經濟實力的雄厚的大公司支援等等。結合我使用過的的幾種C++介面庫和大家交流一下。

1.MFC(MicroSoft Foundation classes):相信在windows下進行開發的各位同僚們都用過MFC進行介面開發。我記得自己初次接觸MFC是大學畢設一個關於數字影象處理的課題,用的IDE是VS 6.0,那時就幹了件“重複造輪子“的事,而且是個大輪子,那時並不知道VS有生成MFC程式的嚮導,結果坐在電腦前沒黑沒白的照著一本參考書上的自動生成程式碼敲了幾天幾夜,結果很殘酷,沒執行起來。著實把我嚇了一跳,以為開發軟體這麼難,現在想想MFC的自動生成程式碼中的有些語言特性直到現在自己也未必完全瞭解。之後學習了孫鑫的《VC++深入程式設計》這才算是對MFC漸漸入了門,但是在此後有相當一段時間內都是對MFC只瞭解其表,會應用,並不瞭解其本質。直到看了侯捷老師的《深入淺出MFC》才算是對MFC有了本質的認識。(侯捷老師的寫作風格很好,這是我第一次真正喜歡上一本計算機書籍)正如侯捷老師所說,要學習MFC首先要對windows程式的事件驅動特性有所瞭解,訊息的產生,獲得,分派,判斷,處理;還要了解C++的性質(封裝,繼承,多型)。之後,侯捷老師又模擬了MFC的六大關鍵技術:MFC的初始化過程,RTTI(執行時型別識別),動態生成,Persistence(永久留存),訊息對映,訊息繞行,到此為止,MFC已經被剖析的很徹底和細緻了,你也可以掌握MFC的本質了吧!

我的使用體驗:支援MFC的IDE我使用過VS 6.0, 2008, 2010,其中 AppWizard,ClassWizard, Resource Editor讓我們能夠很快的構建一個MFC程式。我覺得用MFC實現簡單的UI功能還是很不錯的,但是要實現複雜,美觀的UI,編碼還是過於複雜(其實有很多基於MFC實現的介面庫,有較好的介面效果,但其中有些要收費,我使用過的是Codejock.Xtreme.Toolkit.Pro)。用vs6.0 和 vs 2008 生成的MFC程式還要依賴相應的VC元件執行,生成的可執行程式由於包含了大量的庫比較大。vs 2010生成的可執行程式只需附帶執行時dll就行。

2.WTL(windows 模板庫):一個用來開發 Windows 應用程式的 C++ 的 UI 元件,它擴充套件了 ATL (Active Template Library) 提供了一系列的對話方塊、幀、GDI物件等等。我們使用的的金山衛士就是用wtl開發的….。
以下引自《WTL for MFC Programmers 》“WTL 具有兩面性,它沒有MFC的介面(GUI)類庫那樣功能強大,但是能夠生成很小的可執行檔案。如果你象我一樣使用MFC進行介面程式設計,你會覺得MFC提供的介面控制元件封裝使用起來非常舒服,更不用說MFC內建的訊息處理機制。當然,如果你也象我一樣不希望自己的程式僅僅因為使用了MFC的框架就增加幾百K的大小的話,WTL就是你的選擇。
當然,我們還要克服一些障礙:
1) ATL樣式的模板類初看起來有點怪異 ;2) 沒有類嚮導的支援,所以要手工處理所有的訊息對映。 3) MSDN沒有正式的文件支援,你需要到處去收集有關的文件,甚至是檢視WTL的原始碼。4) 買不到參考書籍 5) 沒有微軟的官方支援 6) ATL/WTL的視窗與MFC的視窗有很大的不同,你所瞭解的有關MFC的知識並不全部適用與WTL。
從另一方面講,WTL也有它自身的優勢:
1) 不需要學習或掌握複雜的文件/檢視框架。 2) 具有MFC的基本的介面特色,比如DDX/DDV和命令狀態的自動更新功能(譯者加:比如選單的Check標記和Enable標記)。 3) 增強了一些MFC的特性(比如更加易用的分隔視窗)。 4) 可生成比靜態連結的MFC程式更小的可執行檔案(譯者加:WTL的所有原始碼都是靜態連結到你的程式中的)。 5) 你可以修正自己使用的WTL中的錯誤(BUG)而不會影響其他的應用程式(相比之下,如果你修正了有BUG的MFC/CRT動態庫就可能會引起其它應用程式的崩潰。
如果你仍然需要使用MFC,MFC的視窗和ATL/WTL的視窗可以“和平共處”。

我的使用體驗:談起使用WTL的過程,很早就聽說過它的這些特點,出於對新技術的熱情,私下裡一直在進行學習,使用的書籍就是《WTL for MFC Programmers》,自我感覺用WTL進行開發非常便利。碰巧工作上接觸了一個使用WTL開發的開源軟體http://infrarecorder.org/,介面功能效果都很不錯,重要的是他幾乎用到了WTL的各種常見介面實現,而且封裝的相當好,我在這個軟體上進行了很多基於WTL和COM的擴充開發,讓我學習到了不少WTL和COM的開發經驗。另外,金山衛士的部分開原始碼我們也可以進行學習。開發環境依然是VS系列,可以下載相應的WTL版本作為外掛整合入VS。

3.Qt:相比於以上兩種介面庫,他最大的優點就是跨平臺。以下引自開源中國社群“Qt是諾基亞開發的一個跨平臺的C++圖形使用者介面應用程式框架。它提供給應用程式開發者建立藝術級的圖形使用者介面所需的所用功能。Qt是完全面向物件的,很容易擴充套件,並且允許真正地元件程式設計。Qt 具有下列優點:
優良的跨平臺特性: Qt支援下列作業系統: Microsoft Windows 95/98, Microsoft Windows NT, Linux, Solaris, SunOS, HP-UX, Digital UNIX (OSF/1, Tru64), Irix, FreeBSD, BSD/OS, SCO, AIX, OS390,QNX 等等;
面向物件 Qt 的良好封裝機制使得 Qt 的模組化程度非常高,可重用性較好,對於使用者開發來說是非常 方便的; Qt 提供了一種稱為 signals/slots 的安全型別來替代 callback,這使得各個元件 之間的協同工作變得十分簡單;
豐富的 API Qt 包括多達 250 個以上的 C++ 類,還替供基於模板的 collections, serialization, file, I/O device, directory management, date/time 類。甚至還包括正則表示式的處理 功能;
支援 2D/3D 圖形渲染,支援 OpenGL;
大量的開發文件;
XML 支援;

我的使用體驗:仍然是出於對新技術的熱情進行的Qt開發,感覺實現複雜的UI功能和效果比以上兩種介面庫容易的多,我用的IDE是Qt Creator,很炫,但是感覺執行效率上沒VS塊(當然是windows平臺下的體驗),特別是逐步除錯推進很慢,有時GCC編譯器會無響應(也可以選擇windows下的編譯器),另外發現一點:資料庫操作時,Qt對SQLite的封裝執行SQL語句很慢,我測試了一下,在sqlite管理工具中執行一條帶表關聯和分頁的SQL語句需要393ms,但是採用Qt封裝的SQLite執行需要1410ms,這數量級可差距大了。(究竟是誰的問題?)

以上講了三種自己使用過的C++介面庫,業界有很多對三種介面庫的對比,優點,缺點,適不適合用云云,我覺得在沒有經過實際應用的情況下去否定另一種是不公平的,這在某種程度上也反映了我們對技術的保守心態,有些人還會抵觸新的技術,我還是認為最好多學幾種相關技術,然後在最合適的場景下去應用,比如如果要進行網路分發客戶端的情況下我會拋棄MFC而選擇WTL,減少網路資料傳輸量,要是在跨平臺場景下我會首選Qt,你懂的。