GTK 與MFC不完全對比

2021-06-16 02:03:51 字數 2371 閱讀 3679

mfc已經江河日下,日漸式微,而gtk+可謂欣欣向榮,如日中天。這裡無意於落井下石,痛打落水狗,貶mfc而尊gtk+。自己即在使用mfc也在使用gtk+,不會偏袒其中之任何一方。這個對比完全出於個人對兩者的理解,說它是不完全對比,一方面只是一時興起想做個筆記而已,另外一方面我對兩者的理解也是有限的。

1.         兩者都是基於物件導向設計的。儘管mfc是用c++寫的,而gtk+是用c寫的,但思想都是物件導向的。gtk+使用glib的物件機制,由於用c寫的,其實現相對有點繁瑣。

2.         兩者都是基於訊息驅動的。這是gui系統的共性,訊息可以是硬體上報的,如滑鼠事件、鍵盤事件和觸控螢幕等等,也可以是程式產生,如乙個視窗給另外乙個視窗傳送了乙個訊息。但兩者並不完全相同,gtk+通過select掛在多個檔案描述符上,可以同時等待多個事件源,比如socket、子程序退出和核心事件等等,而mfc只能通過getmessage掛到訊息佇列上。

3.         兩者都不是執行緒安全的,即只有乙個執行緒可以操作gui資源。主要是出於效能的考慮,這個問題不大,因大多數應用程式都是單執行緒的。而且它們都提供一些機制,讓其它執行緒可以在必要時操作gui資源。在gtk+中可以通過idle函式來實現,在mfc中可以通過postmessage來實現(附帶說明一下:win32原生的gui api是執行緒安全的)。

4.         gtk+整合了一系列的基礎函式庫,功能強大,而mfc孤軍做戰,勢單力薄。glib是gtk+的基本庫,裡面實現了常見的容器和演算法,可謂應有盡有,同時隔離了平台相關的功能。pango是gtk+用於文字渲染的函式庫,它負責控制不同文字的layout布局,而把字模的繪製交給freetype等字型函式庫處理。mfc雖然實現了一些容器,但數量不多也不好用,除了對原生gui api的包裝外,沒提供多少其它功能,與microsoft foundation class library這個名稱一點都不相稱。

5.         gtk+是跨平台的,而mfc則不是。gtk+在設計時就考慮了可移植性,它按分層模型來組織整個系統,glib封裝了依賴於os平台的函式,提供一套抽象的介面,在不同的平台有不同的實現。gdk封裝了依賴於輸入/輸出裝置的功能,如鍵盤事件的獲取和顯示緩衝的輸出,同時實現了基本的繪圖功能。gtk+幾乎可以在所有pc平台下執行,而mfc從來都沒有考慮過可移植性,它是與win32 gui繫結在一起的。

6.         gtk+小巧,而mfc笨重。gtk+編譯出來的可執行檔案約3m左右,而mfc本身雖然不大,但它各種版本加在一起就可觀了。mfc有ansi版本、有unicode版、有debug版、有release版、還有一些組合,如果你因此而暈倒了,那是很正常的。

7.         gtk+的使用簡單,mfc的使用繁瑣。gtk+的使用比較簡單,即使在沒有工具的幫助下,要寫乙個gtk+的應用程式也不難,實際上絕大多數gtk+應用程式都是一行**一行**的敲出來的。而mfc的使用則太麻煩了,很難想象沒有vc的嚮導的幫助,寫乙個基於mfc的應用程式。即有了vc的嚮導,仍有大量的程式設計師說mfc很難用。

8.         gtk+使用signal機制,解開訊息源與訊息目標之間耦合。而mfc使用訊息,將訊息源與訊息目標硬編碼在一起。signal的好處是,不需要知道目標是誰,誰關心誰就註冊,這種出版訂閱機制是解耦的最佳方式。而mfc的訊息則是必須知道目標是誰,把訊息源與訊息目標死死的綁在一起。mfc提供了一套文件/檢視框架,實現了類似出版訂閱的功能,這本是設計者引以自豪的東西,結果因為太複雜不能被人理解,反而為開發人員所詬病。

9.         gtk+採用layout機制動態計算各子視窗的座標位置,自適應螢幕大小的變化。而mfc要求子視窗的座標位置硬編碼,結果要適應不同解析度的螢幕非常困難。gtk+在視窗布局時分為兩個階段,第乙個階段父視窗先詢問子視窗的最佳大小,第二個階段父視窗根據自己的大小計算子視窗的實際大小,子視窗根據實際大小進行調整。

10.     gtk+採用容器機制來合理分離控制項的職責,mfc沒有容器這個概念,很難實現遞迴組合。gtk+中差不多所有控制項都是容器,都可以容納其它任何控制項,而mfc只有頂層視窗才是容器,可以容納其它子控制項。容器這個概念對**重用的影響非常之大,這裡舉兩個例子:其一是帶的按鈕(bitmapbutton),在gtk+中它就是gtkimage和gtklabel的組合,而在mfc中,和文字都要自己繪製。前者的gtkimage和gtklabel可以在很多地方重用,而後都的繪製**和事件處理**只有自己才能使用。其二是列表框,在gtk+中,它只是乙個容器,你可以向裡面放編輯器、下拉框和其它任何者你想得到的控制項。而在mfc中,即使只是實現乙個不同外觀的列表框,你都要採用自繪的方式,**重用非常困難,向列表框中加入其它控制項就更麻煩了,要使用一些非同尋常的手段不可。

11.     gtk+採用容器機制優先使用組合而不是繼承,符合現代設計的原則。mfc強制使用繼承,使用麻煩而且耦合緊密。gtk+應用程式不需要繼承任何視窗。mfc應用程式必須繼承對話方塊或者其它頂層視窗才行,雖然可以採用中介者模式,把控制項之間的互動集中在頂層視窗中,不需要繼承控制項,但仍然很麻煩。

GTK 與MFC不完全對比

mfc 已經江河日下,日漸式微,而 gtk 可謂欣欣向榮,如日中天。這裡無意於落井下石,痛打落水狗,貶 mfc而尊 gtk 自己即在使用 mfc也在使用 gtk 不會偏袒其中之任何一方。這個對比完全出於個人對兩者的理解,說它是不完全對比,一方面只是一時興起想做個筆記而已,另外一方面我對兩者的理解也是...

GTK 與MFC不完全對比

gtk 與mfc 不完全對比 mfc 已經江河日下,日漸式微,而gtk 可謂欣欣向榮,如日中天。這裡無意於落井下石,痛打落水狗,貶mfc而尊gtk 自己即在使用mfc也在使用gtk 不會偏袒其中之任何一方。這個對比完全出於個人對兩者的理解,說它是不完全對比,一方面只是一時興起想做個筆記而已,另外一方...

GTK 與MFC不完全對比

1.兩者都是基於物件導向設計的。儘管mfc是用c 寫的,而gtk 是用c寫的,但思想都是物件導向的。gtk 使用glib的物件機制,由於用c寫的,其實現相對有點繁瑣。2.兩者都是基於訊息驅動的。這是gui系統的共性,訊息可以是 硬體上報的,如滑鼠事件 鍵盤事件和觸控螢幕等等,也可以是程式產生,如乙個...