MFC,QT與WinForm,WPF簡介
程式語言的組成
程式語言做為一種語言自然和英語這些自然語言有類似的地方.學英語時我們知道要先記26個字母,然後單詞及其發音,接下來就是片語,句子.反正簡單的說就是記單詞,熟悉詞法,句法.接下來就是應用了,聽說讀寫.而使用相同語言的人大腦裡都有個翻譯器,可以把自己的想法翻譯成語言然後用說或寫表達出來,而聽和讀則把接收來的語言翻譯成自己大腦能理解的思想.
那程式語言首先也是像英語一樣會制定一些單詞,然後詞法,句法.像int ,char這樣的型別關鍵字,或其他一些關鍵字就是單詞.但這樣的語言機器不認識的.所以就要個編譯器來翻譯成電腦能認識的01串.編譯器就像大腦中的翻譯器了.所以簡單的說起來,一些語法規則加一個編譯器就可以標誌一門新的程式語言產生了
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#程式碼.不太符合我們的思維習慣.