MFC,QT與WinForm,WPF簡介

聰明的笨蛋發表於2016-05-14

  程式語言的組成

  程式語言做為一種語言自然和英語這些自然語言有類似的地方.學英語時我們知道要先記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#程式碼.不太符合我們的思維習慣.

相關文章