MFC框架快速入門 (一)


MFC定義

MFC全稱Microsoft Foundation Classes,也就是微軟基礎類庫。它是VC++的核心,是C++與Windows API的結合,很徹底的用C++封裝了Windows SDK(Software Development Kit,軟件開發工具包)中的結構和功能,還提供了一個應用程序框架,此應用程序框架為軟件開發者完成了一些例行化的工作,比如各種窗口、工具欄、菜單的生成和管理等,不需要開發者再去解決那些很復雜很乏味的難題,比如每個窗口都要使用Windows API注冊、生成與管理。這樣就大大減少了軟件開發者的工作量,提高了開發效率。

利用vs,vc6.0快速生成單文檔應用程序框架

 1.點菜單欄File->New->Project,彈出New Project對話框,我們可以選擇工程類型。

      如果安裝完VS2010以后第一啟動時已經設置為VC++,則Installed Templates->Visual C++項會默認展開,而如果沒有設置VC++,則可以展開到Installed Templates->Other Languages->Visual C++項。因為我們要生成的是MFC程序,所以在“Visual C++”下選擇“MFC”,對話框中間區域會出現三個選項:MFC ActiveX Control、MFC Application和MFC DLL。MFC ActiveX Control用來生成MFC ActiveX控件程序。MFC Application用來生成MFC應用程序。MFC DLL用來生成MFC動態鏈接庫程序。當然我們要選擇MFC Application。

      在對話框下部有Name、Location和Solution name三個設置項。意義如下:Name--工程名,Location--解決方案路徑,Solution name--解決方案名稱。這里Name我們設為“HelloWorld”,Location設置為“桌面”的路徑,Solution name默認和Name一樣,當然可以修改為其他名字,這里我們不作修改,也使用“HelloWorld”。點“OK”按鈕。

VS2010/MFC編程入門之二(利用MFC向導生成單文檔應用程序框架)


      2.這時會彈出“MFC Application Wizard”對話框,上部寫有“Welcome to the MFC Application Wizard”,下面顯示了當前工程的默認設置。第一條“Tabbed multiple document interface (MDI)”是說此工程是多文檔應用程序。如果這時直接點下面的“Finish”按鈕,可生成具有上面列出設置的多文檔程序。但我們此例是要建立單文檔應用程序,所以點“Next”按鈕再繼續設置吧。

      3.接下來彈出的對話框上部寫有“Application Type”,當然是讓選擇應用程序類型,我們看到有四種類型:Single document(單文檔)、Multiple documents(多文檔)、Dialog based(基於對話框)和Multiple top-level documents。我們選擇Single document類型,以生成一個單文檔應用程序框架。單文檔應用程序運行時是一個單窗口界面。

 VS2010/MFC編程入門之二(利用MFC向導生成單文檔應用程序框架)

      此對話框的“Resource language”還提供語言的選擇,這里默認選擇英語。“Project style”可選擇工程風格,我們選擇默認的“Visual Studio”風格。“Use of MFC”有兩個選項:Use MFC in a shared DLL(動態鏈接庫方式使用MFC)和Use MFC in a static library(靜態庫方式使用MFC)。選擇Use MFC in a shared DLL時MFC的類會以動態鏈接庫的方式訪問,所以我們的應用程序本身就會小些,但是發布應用程序時必須同時添加必要的動態鏈接庫,以便在沒有安裝VS2010的機子上能夠正常運行程序。選擇Use MFC in a static library時MFC的類會編譯到可執行文件中,所以應用程序的可執行文件要比上種方式大,但可以單獨發布,不需另加包含MFC類的庫。這里我們使用默認的Use MFC in a shared DLL。點“Next”按鈕。

      4.此時彈出上部寫有“Compound Document Support”的對話框,可以通過它向應用程序加入OLE支持,指定OLE選項的復合文檔類型。本例不需要OLE特性,使用默認值“None”。點“Next”按鈕。

      5.彈出的新對話框上部寫有“Document Template Properties”。“File extension”可以設置程序能處理的文件的擴展名。對話框其他選項還可以更改程序窗口的標題。我們都使用默認設置,點“Next”按鈕。

      6.此時彈出的對話框主題是“Database Support”。用於設置數據庫選項。此向導可以生成數據庫應用程序需要的代碼。它有四個選項:

      None:忽略所有的數據庫支持;

      Header files only:只包含定義了數據庫類的頭文件,但不生成對應特定表的數據庫類或視圖類;

      Database view without file support:創建對應指定表的一個數據庫類和一個視圖類,不附加標准文件支持;

      Database view with file support:創建對應指定表的一個數據庫類和一個視圖類,並附加標准文件支持。

      本例選擇默認值“None”,不使用數據庫特性。點“Next”按鈕。

      7.這時彈出的對話框是關於“User Interface Features”,即用戶界面特性。我們可以設置有無最大化按鈕、最小化按鈕、系統菜單和初始狀態欄等。還可以選擇使用菜單欄和工具欄生成簡單的應用程序還是使用ribbon。這里我們都選擇默認設置。點“Next”進入下一步。

      8.此時彈出“高級特性”對話框。可以設置的高級特性包括有無打印和打印預覽等。在“Number of files on recent file list”項可以設置在程序界面的文件菜單下面最近打開文件的個數。我們仍使用默認值。點“Next”按鈕。

      9.彈出“生成類”對話框。在對話框上部的“生成類”列表框內,列出了將要生成的4 個類:一個視圖類(CHelloWorldView)、一個應用類(CHelloWorldApp)、一個文檔類(CHelloWorldDoc)和一個主框架窗口類(CMainFrame)。在對話框下面的幾個編輯框中,可以修改默認的類名、類的頭文件名和源文件名。對於視圖類,還可以修改其基類名稱,默認的基類是CView,還有其他幾個基類可以選擇。這里我們還是使用默認設置。點“Finish”按鈕。

      應用程序向導最后為我們生成了應用程序框架,並在Solution Explorer中自動打開了解決方案(見上面第一張圖)。

項目文件組成

       1.解決方案相關文件

       解決方案相關文件包括解決方案文件夾下的.sdf文件、.sln文件、.suo文件和ipch文件夾。

       .sdf文件和ipch目錄一般占用空間比較大,幾十兆甚至上百兆,與智能提示、錯誤提示、代碼恢復和團隊本地倉庫等相關。如果你覺得不需要則可以設置不生成它們,方法是點擊菜單欄Tools->Options,彈出Options對話框,選擇左側面板中Text Editor->C/C++->Advanced,右側列表中第一項Disable Database由False改為True就可以了,最后關閉VS2010再刪除.sdf文件和ipch目錄以后就不會再產生了。但關閉此選項以后也會有很多不便,例如寫程序時的智能提示沒有了。

       .sln文件和.suo文件為MFC自動生成的解決方案文件,它包含當前解決方案中的工程信息,存儲解決方案的設置。

       2.工程相關文件

       工程相關文件包括工程文件夾下的.vcxproj文件和.vcxproj.filters文件。

       .vcxproj文件是MFC生成的工程文件,它包含當前工程的設置和工程所包含的文件等信息。.vcxproj.filters文件存放工程的虛擬目錄信息,也就是在解決方案瀏覽器中的目錄結構信息。

       3.應用程序頭文件和源文件

       應用程序向導會根據應用程序的類型(單文檔、多文檔或基於對話框的程序)自動生成一些頭文件和源文件,這些文件是工程的主體部分,用於實現主框架、文檔、視圖等。雞啄米下面分別簡單介紹下各個文件:

       HelloWorld.h:應用程序的主頭文件。主要包含由CWinAppEx類派生的CHelloWorldApp類的聲明,以及CHelloWorldApp類的全局對象theApp的聲明。

       HelloWorld.cpp:應用程序的主源文件。主要包含CHelloWorldApp類的實現,CHelloWorldApp類的全局對象theApp的定義等。

       MainFrm.h和MainFrm.cpp:通過這兩個文件從CFrameWndEx類派生出CMainFrame類,用於創建主框架、菜單欄、工具欄和狀態欄等。

       HelloWorldDoc.h和HelloWorldDoc.cpp:這兩個文件從CDocument類派生出文檔類CHelloWorldDoc,包含一些用來初始化文檔、串行化(保存和裝入)文檔和調試的成員函數。

       HelloWorldView.h和HelloWorldView.cpp:它們從CView類派生出名為CHelloWorldView的視圖類,用來顯示和打印文檔數據,包含了一些繪圖和用於調試的成員函數。

       ClassView.h和ClassView.cpp:由CDockablePane類派生出CClassView類,用於實現應用程序界面左側面板上的Class View。

       FileView.h和FileView.cpp:由CDockablePane類派生出CFileView類,用於實現應用程序界面左側面板上的File View。

       OutputWnd.h和OutputWnd.cpp:由CDockablePane類派生出COutputWnd類,用於實現應用程序界面下側面板Output。

       PropertiesWnd.h和PropertiesWnd.cpp:由CDockablePane類派生出CPropertiesWnd類,用於實現應用程序界面右側面板Properties。

       ViewTree.h和ViewTree.cpp:由CTreeCtrl類派生出CViewTree類,用於實現出現在ClassView和FileView等中的樹視圖。

       4.資源文件

       一般我們使用MFC生成窗口程序都會有對話框、圖標、菜單等資源,應用程序向導會生成資源相關文件:res目錄、HelloWorld.rc文件和Resource.h文件。

       res目錄:工程文件夾下的res目錄中含有應用程序默認圖標、工具欄使用圖標等圖標文件。

       HelloWorld.rc:包含默認菜單定義、字符串表和加速鍵表,指定了默認的About對話框和應用程序默認圖標文件等。

       Resource.h:含有各種資源的ID定義。

       5.預編譯頭文件

       幾乎所有的MFC程序的文件都要包含afxwin.h等文件,如果每次都編譯一次則會大大減慢編譯速度。所以把常用的MFC頭文件都放到了stdafx.h文件中,然后由stdafx.cpp包含stdafx.h文件,編譯器對stdafx.cpp只編譯一次,並生成編譯之后的預編譯頭HelloWorld.pch,大大提高了編譯效率。

       6.編譯鏈接生成文件

       如果是Debug方式編譯,則會在解決方案文件夾和工程文件夾下都生成Debug子文件夾,而如果是Release方式編譯則生成Release子文件夾。

       工程文件夾下的Debug或Release子文件夾中包含了編譯鏈接時產生的中間文件,解決方案文件夾下的Debug或Release子文件夾中主要包含有應用程序的可執行文件。

MFC程序運行流程 

  MFC應用程序的運行流程先進行一些初始化過程,再注冊並創建窗口,然后顯示、更新窗口,最后進入消息循環,消息都由窗口過程函數處理。自動生成的MFC框架中比較重要的類包括以下幾個:CHelloWorldApp、CMainFrame、CHelloWorldDoc和CHelloWorldView,至於其他的類比如CClassView、CFileView等都是在框架窗口(CMainFrame)上創建的面板等,不是必要的。CHelloWorldApp類處理消息,將收到的消息分發給相應的對象。CMainFrame是視圖CHelloWorldView的父窗口,視圖CHelloWorldView就顯示在CMainFrame的客戶區中。視圖類CHelloWorldView用來顯示文檔類CHelloWorldDoc中的數據,並根據對視圖類的操作修改文檔類的數據。一個視圖類只能跟一個文檔類相聯系,而一個文檔類可以跟多個視圖類相聯系。關於視圖類和文檔類的關系后面會詳細講解。

MFC的消息響應機制

   窗口消息一般由三個部分組成:1.一個無符號整數,是消息值;(2)消息附帶的WPARAM類型的參數;(3)消息附帶的LPARAM類型的參數。其實我們一般所說的消息是狹義上的消息值,也就是一個無符號整數,經常被定義為宏。

  MFC使用一種消息映射機制來處理消息,在應用程序框架中的表現就是一個消息與消息處理函數一一對應的消息映射表,以及消息處理函數的聲明和實現等代碼。當窗口接收到消息時,會到消息映射表中查找該消息對應的消息處理函數,然后由消息處理函數進行相應的處理。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM