MFC和GTK的区别
關(guān)鍵技術(shù)
http://blog.csdn.net/master_max/article/details/1540204
?
?
MFC和GTK的區(qū)別??
1. 兩者都是基于面向?qū)ο笤O(shè)計(jì)的。盡管MFC是用C++寫(xiě)的,而GTK+是用C寫(xiě)的,但思想都是面向?qū)ο蟮摹TK+使用glib的對(duì)象機(jī)制,由于用C寫(xiě)的,其實(shí)現(xiàn)相對(duì)有點(diǎn)繁瑣。
2. 兩者都是基于消息驅(qū)動(dòng)的。這是GUI系統(tǒng)的共性,消息可以是硬件上報(bào)的,如鼠標(biāo)事件、鍵盤(pán)事件和觸摸屏等等,也可以是程序產(chǎn)生,如一個(gè)窗口給另外一個(gè)窗口 發(fā)送了一個(gè)消息。但兩者并不完全相同,GTK+通過(guò)select掛在多個(gè)文件描述符上,可以同時(shí)等待多個(gè)事件源,比如socket、子進(jìn)程退出和內(nèi)核事件 等等,而MFC只能通過(guò)GetMessage掛到消息隊(duì)列上。
3. 兩者都不是線程安全的,即只有一個(gè)線程可以操作GUI資源。主要是出于性能的考慮,這個(gè)問(wèn)題不大,因大多數(shù)應(yīng)用程序都是單線程的。而且它們都提供一些機(jī) 制,讓其它線程可以在必要時(shí)操作GUI資源。在GTK+中可以通過(guò)idle函數(shù)來(lái)實(shí)現(xiàn),在MFC中可以通過(guò)PostMessage來(lái)實(shí)現(xiàn)(附帶說(shuō)明一下: Win32原生的GUI API是線程安全的)。
4. GTK+整合了一系列的基礎(chǔ)函數(shù)庫(kù),功能強(qiáng)大,而MFC孤軍做戰(zhàn),勢(shì)單力薄。Glib是GTK+的基本庫(kù),里面實(shí)現(xiàn)了常見(jiàn)的容器和算法,可謂應(yīng)有盡有,同 時(shí)隔離了平臺(tái)相關(guān)的功能。Pango是GTK+用于文字渲染的函數(shù)庫(kù),它負(fù)責(zé)控制不同文字的layout布局,而把字模的繪制交給freetype等字體 函數(shù)庫(kù)處理。MFC雖然實(shí)現(xiàn)了一些容器,但數(shù)量不多也不好用,除了對(duì)原生GUI API的包裝外,沒(méi)提供多少其它功能,與Microsoft Foundation Class Library這個(gè)名稱一點(diǎn)都不相稱。
5. GTK+是跨平臺(tái)的,而MFC則不是。GTK+在設(shè)計(jì)時(shí)就考慮了可移植性,它按分層模型來(lái)組織整個(gè)系統(tǒng),Glib封裝了依賴于OS平臺(tái)的函數(shù),提供一套抽 象的接口,在不同的平臺(tái)有不同的實(shí)現(xiàn)。GDK封裝了依賴于輸入/輸出設(shè)備的功能,如鍵盤(pán)事件的獲取和顯示緩沖的輸出,同時(shí)實(shí)現(xiàn)了基本的繪圖功能。GTK+ 幾乎可以在所有PC平臺(tái)下運(yùn)行,而MFC從來(lái)都沒(méi)有考慮過(guò)可移植性,它是與Win32 GUI綁定在一起的。
6. GTK+小巧,而MFC笨重。GTK+編譯出來(lái)的可執(zhí)行文件約3M左右,而MFC本身雖然不大,但它各種版本加在一起就可觀了。MFC有ansi版本、有 unicode版、有debug版、有release版、還有一些組合,如果你因此而暈倒了,那是很正常的。
7. GTK+的使用簡(jiǎn)單,MFC的使用繁瑣。GTK+的使用比較簡(jiǎn)單,即使在沒(méi)有工具的幫助下,要寫(xiě)一個(gè)GTK+的應(yīng)用程序也不難,實(shí)際上絕大多數(shù)GTK+應(yīng)用程序都是一行代碼一行代碼的敲出來(lái)的。而MFC的使用則太麻煩了,很難想象沒(méi)有VC的向?qū)У膸椭?#xff0c;寫(xiě)一個(gè)基于MFC的應(yīng)用程序。即有了VC的向?qū)?#xff0c;仍有大量的程序員說(shuō)MFC很難用。
8. GTK+使用signal機(jī)制,解開(kāi)消息源與消息目標(biāo)之間耦合。而MFC使用消息,將消息源與消息目標(biāo)硬編碼在一起。Signal的好處是,不需要知道目 標(biāo)是誰(shuí),誰(shuí)關(guān)心誰(shuí)就注冊(cè),這種出版訂閱機(jī)制是解耦的最佳方式。而MFC的消息則是必須知道目標(biāo)是誰(shuí),把消息源與消息目標(biāo)死死的綁在一起。MFC提供了一套 文檔/視圖框架,實(shí)現(xiàn)了類似出版訂閱的功能,這本是設(shè)計(jì)者引以自豪的東西,結(jié)果因?yàn)樘珡?fù)雜不能被人理解,反而為開(kāi)發(fā)人員所詬病。
9. GTK+采用layout機(jī)制動(dòng)態(tài)計(jì)算各子窗口的坐標(biāo)位置,自適應(yīng)屏幕大小的變化。而MFC要求子窗口的坐標(biāo)位置硬編碼,結(jié)果要適應(yīng)不同分辨率的屏幕非常 困難。GTK+在窗口布局時(shí)分為兩個(gè)階段,第一個(gè)階段父窗口先詢問(wèn)子窗口的最佳大小,第二個(gè)階段父窗口根據(jù)自己的大小計(jì)算子窗口的實(shí)際大小,子窗口根據(jù)實(shí) 際大小進(jìn)行調(diào)整。
10. GTK+采用容器機(jī)制來(lái)合理分離控件的職責(zé),MFC沒(méi)有容器這個(gè)概念,很難實(shí)現(xiàn)遞歸組合。GTK+中差不多所有控件都是容器,都可以容納其它任何控件,而 MFC只有頂層窗口才是容器,可以容納其它子控件。容器這個(gè)概念對(duì)代碼重用的影響非常之大,這里舉兩個(gè)例子:其一是帶圖片的按鈕 (BitmapButton),在GTK+中它就是GtkImage和GtkLabel的組合,而在MFC中,圖片和文字都要自己繪制。前者的 GtkImage和GtkLabel可以在很多地方重用,而后都的繪制代碼和事件處理代碼只有自己才能使用。其二是列表框,在GTK+中,它只是一個(gè)容 器,你可以向里面放編輯器、下拉框和其它任何者你想得到的控件。而在MFC中,即使只是實(shí)現(xiàn)一個(gè)不同外觀的列表框,你都要采用自繪的方式,代碼重用非常困 難,向列表框中加入其它控件就更麻煩了,要使用一些非同尋常的手段不可。
11. GTK+采用容器機(jī)制優(yōu)先使用組合而不是繼承,符合現(xiàn)代設(shè)計(jì)的原則。MFC強(qiáng)制使用繼承,使用麻煩而且耦合緊密。GTK+應(yīng)用程序不需要繼承任何窗口。 MFC應(yīng)用程序必須繼承對(duì)話框或者其它頂層窗口才行,雖然可以采用中介者模式,把控件之間的交互集中在頂層窗口中,不需要繼承控件,但仍然很麻煩。
轉(zhuǎn)載于:https://www.cnblogs.com/fickleness/p/3148843.html
總結(jié)
以上是生活随笔為你收集整理的MFC和GTK的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何能治疗输卵管不通?
- 下一篇: 奶山羊多少钱一只啊?