編程語言的組成
編程語言作爲一種語言天然和英語這些天然語言有相似的地方.學英語時咱們知道要先記26個字母,而後單詞及其發音,接下來就是詞組,句子.反正簡單的說就是記單詞,熟悉詞法,句法.接下來就是應用了,據說讀寫.而使用相同語言的人大腦裏都有個翻譯器,能夠把本身的想法翻譯成語言而後用說或寫表達出來,而聽和讀則把接收來的語言翻譯成本身大腦能理解的思想.c++
那編程語言首先也是像英語同樣會制定一些單詞,而後詞法,句法.像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界面的).windows
咱們知道各類設計模式是滿天飛,五花八門,但知名度最高的是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#代碼.不太符合咱們的思惟習慣.————————————————版權聲明:本文爲CSDN博主「聰明的笨蛋」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。原文連接:https://blog.csdn.net/weiwenhp/article/details/8442553