MFC,QT與WinForm,WPF簡介

 

編程語言的組成

編程語言做爲一種語言自然和英語這些自然語言有類似的地方.學英語時我們知道要先記26個字母,然後單詞及其發音,接下來就是詞組,句子.反正簡單的說就是記單詞,熟悉詞法,句法.接下來就是應用了,聽說讀寫.而使用相同語言的人大腦裏都有個翻譯器,可以把自己的想法翻譯成語言然後用說或寫表達出來,而聽和讀則把接收來的語言翻譯成自己大腦能理解的思想.

那編程語言首先也是像英語一樣會制定一些單詞,然後詞法,句法.像int ,char這樣的類型關鍵字,或其他一些關鍵字就是單詞.但這樣的語言機器不認識的.所以就要個編譯器來翻譯成電腦能認識的01串.編譯器就像大腦中的翻譯器了.所以簡單的說起來,一些語法規則加一個編譯器就可以標誌一門新的編程語言產生了.但語言內置的的都是些非常基本的操作,你要實現個啥複雜點的功能得寫很多很多代碼,於是有些人就先把很多常用的操作寫好代碼放那,你以後只管去調用.造好了很多輪子等着你用就行.這就是開發一些庫(library)讓你調用.在面向對象的語言中一般就叫類庫,就是一堆堆的類嘛.如果類庫足夠強大,我們也可以叫作框架.反正我們可以簡單的把框架理解爲一些功能強大並且聯繫緊密的類庫.

MFC和QT是C++中常見的GUI框架,而WinForm和WPF是C#中常用的框架,不過我們一般很少叫WinForm框架,可能直接叫圖形控件類庫更多點.反正只是個稱呼罷了,愛咋叫就咋叫.另外WinForm與WPF(即Windows Form與Windows Presentation Foundation,用於windows的上的桌面應用開發)都只是提供了一堆GUI類庫,而MFC與QT除了一堆GUI類庫外還提供了其他很多類.功能更強大.

 

GUI的重要性

GUI即graphical user interface(圖形用戶界面).可能很多人覺得整那些頁面是個沒啥技術含量的活.但實際上很多時候用戶可不知道你後臺代碼咋寫,也不管你咋寫.他們看到的只有UI,覺得頁面看着舒服,用起來性能不是太差,用個專業點的詞說就是用戶體驗很好,那這就是個好軟件產品.像蘋果公司的產品這麼受歡迎其中很重要的一個原因就是UI做的漂亮,讓人覺得很酷.我們開發一個軟件產品時,如果站在開發者的角度(站其他角度可能不一樣)一個軟件無非就是保存數據,處理數據,數據間一些邏輯操作,然後通過一個好友的UI界面與用戶交互(當然有少數後臺軟件是不需要UI界面的).

我們知道各種設計模式是滿天飛,五花八門,但知名度最高的是MVC模式(model , view,controller).就很好的體現了這一點,model + controller是數據處理那一塊,而view就是UI界面.實際上QT,MFC,WinForm,WPF都相當於簡化的MVC模式,由三層變成兩層.model +controller沒做區分,弄成一層了.而view這一層則是單獨弄出來,UI與與數據的邏輯處理代碼的分離使得條理清晰,便於理解與維護.而且更重要的是很多UI控件都是做好了的,你直接拖來用不行.

另外你可能可能聽說過STL(standard template library),標準模板庫相當於把數據結構及對數據的操作(算法)這些常用的東東都做好給你調用,相當於把數據結構和算法那些思想實現成通用的代碼供你調用.

 

爲啥把這四個框架放一起來說呢,因爲四者之前有類似的地方.相同語言之間的框架有相似那是毫無疑問,但實際上不同語言之間的類庫也有類似的地方了.C++中的MFC和C#中的WinForm有點類似,而C++中的QT與C#中的WPF又有點類似

 

MFC與WinForm

前面講了這四個框架都是簡化的兩層的MVC模式.MFC中數據的邏輯處理自然是放後綴爲h,cpp的這些文件中.而頁面相關的那一堆東東放資源文件rc後綴的文件中.一般是一個project對應一個rc文件,但也可以多個project共用一個rc文件.當然在VS這開發環境中不會因爲所有信息放rc文件中就所有頁面控件堆一起了.在Resource View可以看到一個個分開的Dialog,每個Dialog就是一個頁面,裏面裝着button等一些控件.當然資源文件還可以放其他資源的比如String Table,Bitmap之類的.如果你查看rc文件裏的code,都是一堆begin 和end包起來的亂七八糟的東東.內容自然是控件的一些屬性.code語法跟c++標準語法沒半毛錢關係.也不知道是按啥語法組織的.

分開了UI層,如果那些處理數據邏輯的代碼要與UI交互就靠資源ID去關聯.比如很多類可以共用一個Dialog頁面,當然了很多時候我們一般是一個class對應一個dialog的.MFC中UI頁面與後臺代碼交互起來很不方便.比如要讓某個控件(button,combobox之類的)與某個變量對應起來還得在DoDataExchange那函數裏面寫點代碼關聯起來.如果要點button要對應啥操作還得通過begin_message_map這樣的宏來關聯下.把某個控件送出的消息與一個函數對應起來的.當然了因爲所有控件都繼承自CWnd這類,所以也可以通過這類的一些函數去直接操作控件,比如GetDlgItem這樣的函數,傳資源ID做參數就行.

WinForm中也遺留了MFC一些思想,比如還有類似資源文件的東東,像Resources.resx文件,裏面一般是放圖片信息,然後Setting.settings就類似MFC裏的string table.只不過這些功能在C#中用的很少.那些頁面控件也不再是放資源文件中.WinForm中一切皆使用面向對象,數據邏輯處理代碼與UI代碼都是在同一個類中,只不過C#有分部類的概念,就是說同一個類的代碼可以分開在幾個文件中.假如有窗口類FormArwen,則數據邏輯代碼放在FormArwen.cs文件中,UI代碼放FormArwen.Designer.cs文件中.只不過這兩個文件中類的定義都要寫在partial class FormArwen 其中關鍵字partial是C#中獨有的關鍵字,用來表示分部類,一個類可以在多個文件中定義.這裏的UI代碼也完全是標準的C#代碼,不像MFC資源文件缺乏可讀性.而且你完全可以把UI代碼拷貝到數據邏輯代碼中,放一起也完全沒問題.

窗口中每一個控件都有一個name,相當於mfc中的資源ID吧,然後你在代碼中調用控件時直接用這個名字就行,就相當於一個變量名字.所以代碼與UI交互起來非常方便,另外MFC中的消息機制在這裏被封裝成了事件(event),你選中任意一個控件然後在它的propterties 的event頁面中選擇任意一個事件點擊下就會自動生成一個類,你往類中直接寫要處理的事件代碼就行.這實際上就是把win32 API中複雜的消息機制簡化爲一個event,用戶用起來很方便,也不用管背後的複雜邏輯.MFC雖然對消息機制做了些封裝,但封裝的還不夠好.

所以WinForm相對MFC而言,UI代碼與數據邏輯處理代碼交互更簡單,更條理清晰,易於理解.背後一些複雜的細節都封裝了不用用戶管了.而且UI控件是功能更強大,看起來更漂亮啊.

 

 

QT與WPF

同爲C++的GUI框架,QT與MFC不那麼相似,那種邏輯反而更接近C#的wpf框架一點.首先不是所有UI相關代碼都像MFC一樣整到一個rc文件,而是一個UI頁面有對應一個後綴爲ui的的xml文件.而數據邏輯處理代碼是放h,cpp文件中.而且這三個誰的名字都相同. 而如果要與控件交互也跟wpf一樣方便,每個控件有個objectName,相當於MFC的資源ID號,然後調用控件時直接用這個名字就行,當然前面要加個指向自身所在類的指針.比如有類Arwen,有button名爲btn,則一般是先Arwen* ui; 然後ui->btn就行.實際上跟wpf中用this.btn一樣,只不過wpf中this前綴是可以省略的. 另外QT裏面也沒有MFC中的消息處理概念,而是封裝成一個叫signal / slot的機制.這跟C#中的WinForm事件(event)非常類似,例如你右擊QT中的一個按鈕,然後右擊go to slot選擇一種signal,就相當於C#裏面的各種類型的事件,當然signal的各類要少點.然後slot就是事件對應的處理函數.

WPF也是一個UI頁面對應一個文件,後綴爲xaml的文件,xaml全稱是eXtensible Application Markup Language我們可以把它看成一種特殊的xml文件.而QT裏面的ui文件就是標準的xml文件了啊.然後其他UI無關的代碼就放xaml.cs文件中.

 

應該說從符合我們思維習慣的角度來說WinForm是最容易理解的,UI頁面對應的代碼完全是標準C#代碼. 而MFC頁面對應的rc文件,QT頁面對應的xml文件,WPF頁面對應的xaml文件都不是標準的C++或C#代碼.不太符合我們的思維習慣.

 

本文來源:http://blog.csdn.net/weiwenhp/article/details/8442553

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章