MFC,QT與WinForm,WPF簡介

2021-02-23 馬少爺

1、程式語言的組成

    程式語言做為一種語言自然和英語這些自然語言有類似的地方.學英語時我們知道要先記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類庫外還提供了其他很多類.功能更強大. 

2、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又有點類似

 3、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控制項是功能更強大,看起來更漂亮啊.

4、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#代碼.不太符合我們的思維習慣.

參考文獻:

https://blog.csdn.net/weiwenhp/article/details/8442553

相關焦點

  • 學習qt07QtCreator技巧
    qt擴展了元對象,信號與槽,屬性.在類中私處聲明Q_OBJECT宏,生成能夠支持元對象代碼的c++文件.metaObject返回元對象.其有許多接口,如QMetaObject::className()類名.newInstance新實例.inherits是否繼承某個串表示的類.tr和trUtf8可翻譯串,setProperty/property來取置屬性.
  • MFC下的cstring與char互相轉換方法
    Mfc下的cstring與char互相轉換方法本次課程主要來為大家講一下平時我們總是在mfc下環境開發中使用的char類型的數組和cstring格式的轉換,還有在qt下該如何轉換,送給有需要的小夥伴們。
  • 原創:.NET中winform與webform互相通訊實例
    原創:.NET中winform與webform互相通訊實例 現在C#越來越多朋友使用了,大家都知道.NET可以開發winform與webform頁面,有時候在開發項目過程中要結合BS+CS這樣來應用
  • winform傻瓜講解
    winform真的,把所有的代碼都看懂了,打會了,考試就能如魚得水,也沒有選擇,還可以神龍擺尾一下,所以說這篇裡我就主要給你們講講代碼,說一說比較重要或者好拿分的部分。
  • 應用C#設計winform的一些心得
    近期,因工作需要,應用C#設計了一個winform界面,主要是用來實現人員的量化積分管理,類似於很多單位的績效考核管理系統那種。
  • 經驗 【修改版】winform傻瓜講解
    winform真的,把所有的代碼都看懂了,打會了,考試就能如魚得水,也沒有選擇,還可以神龍擺尾一下,所以說這篇裡我就主要給你們講講代碼,說一說比較重要或者好拿分的部分。
  • 單目標跟蹤論文綜述:SiamFC、Siam系列和GradNet
    這一切都源於2016年siamFC的提出,siamfc實際上就是將跟蹤當做匹配問題,下面具體介紹siamfc。不過在siamfc中背景信息完全被丟棄,換句話說,siamfc對缺乏對背景的利用,也導致模型的判別性不足,後續有相關工作對此進行改進。
  • Qt 國際化(下)
    我們要在 main()函數中添加幾句:int main(int argc, char *argv[]){ QApplication a(argc, argv); QTranslator qtTranslator; qtTranslator.load("myapp.qm"); a.installTranslator
  • .NET桌面程序(WINFORM或WPF)的部署
  • Qt值得學習嗎?詳解Qt的幾種開發方式
    qt值得學習嗎?嵌入式要學的東西真的很多,我們可能會說不寫界面的話就不用學qt了?我不贊同。Qt的實現主要是採用p-impl手法,實現接口與實現分離,它有很好的消息循環機制,有的對象與線程的相關性,它也有藉助moc生成反射元信息,這種設計方法至今仍然非常適用。qt內核部分其實是完全和界面無關的,你完全可以拋開Qt GUI部分來學習和使用Qt。
  • Qt信號槽原理
    (const char *);    virtual int qt_metacall(QMetaObject::Call, int, void **);    QT_WARNING_POP    QT_TR_FUNCTIONSprivate:    Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall
  • Razor-qt:一個輕巧快捷的桌面環境
    不過你很幸運,因為Razor-qt——一個輕巧、簡單的Qt桌面環境——來了。Razor-qt 並非一個完整的、可以和KDE或GNOME相提並論的桌面環境;最重要的是,它假設已經有了一個窗口管理器,需要與之合作方可完成任務。
  • Qt for MCUs 快速上手實踐
    /product/develop-software-microcontrollers-mcu;如果需要獲取試用版License,直接在官網qt.io填寫試用申請,然後登陸帳號,下載Qt Online Installer安裝工具安裝即可。
  • Qt的信號是私有還是公有
    # define QT_ANNOTATE_ACCESS_SPECIFIER(x)# define slots Q_SLOTS# define signals Q_SIGNALS# define Q_SLOTS QT_ANNOTATE_ACCESS_SPECIFIER(qt_slot)# define
  • Qt 國際化(上)
    下面我們要修改 main()函數,使之加載這個 qm 文件:int main(int argc, char *argv[]){ QApplication a(argc, argv); QTranslator qtTranslator; qtTranslator.load("myapp.qm
  • 示例程序詳解MFC動態連結庫
    動態連結庫分為兩種win32和mfc動態連結庫,今天我們講解MFC動態連結庫 再閱讀本文之前,希望你看看《動態連結庫基礎詳解》
  • QT 技術應用常用問題解答
    另外,還有一個更快的方法,在原始碼解開後有一個目錄translations,下面有一些.ts, .qm文件,我們拷貝一個:Quote:cp src/translations/qt_untranslated.ts .
  • winform項目——仿QQ即時通訊程序09:socket通信示例程序
    下面,這是一個winform版利用socket進行通訊的例子。首先,我們打開VS2015,新建一個windows窗體項目,叫做服務端程序。然後在窗體上拖兩個按鈕和一個label,如下圖:一個寫啟動服務,一個寫發送消息。 雙擊啟動服務按鈕,進入按鈕的點擊事件。
  • Lodge 洛極 琺瑯鑄鐵鍋 灰色 6 qt
    Lodge 洛極 琺瑯鑄鐵鍋 灰色 6 qt 2017年11月20日 16:31作者:網絡編輯:網絡 Lodge 洛極 琺瑯鑄鐵鍋 灰色 6 qt