天天看點

第四課——MFC應用程式架構

一、MFC應用程式類型

上篇文章的彩蛋:可通過使用MFC應用程式向導(MFC AppWizard)的功能來建立所需要的應用程式,這意味着不需要輸入任何代碼。MFC除了應用程式向導,還對應用程式項目有着獨特的管理方式。

1. MFC AppWizard

  作用:能為使用者生成一些常用的标準程式結構和程式設計風格,它們被稱為應用程式架構結構。

  提供的應用程式架構類型:包括MFC AppWizard(dll)、MFC AppWizard(exe)、Win32 Application等,這些類型基本上能滿足各個層次使用者的不同需要,但一般的使用者更關心的是MFC AppWizard(exe)應用程式架構,因為它包含使用者最常用的三種應用程式類型:單文檔、多文檔和基于對話框的應用程式。

2. 單文檔應用程式、多文檔應用程式、基于對話框的應用程式

  基于對話框的應用程式:沒有菜單、工具欄及狀态欄,也不能處理文檔

下面的篇幅都預設已經建立了一個單文檔應用程式Ex_SDI

二、項目檔案和項目配置

1. 工程/項目

  應用程式包含了除源程式外的許多資訊,是以在Visual C++中常将它們稱為“項目”或“工程”。

2. 工作檔案夾

  Visual C++是用檔案夾來管理一個應用程式項目的,這個檔案夾稱為“工作檔案夾”,且檔案夾名就是項目名。如Ex_SDI就是一個工作檔案夾名。

  在工作檔案夾下包含源程式代碼檔案(.cpp、.h)、項目檔案(.dsp)以及項目工作區檔案(.dsw)等。

3. 探索工作檔案夾

  以單文檔應用程式項目Ex_SDI為例,該檔案夾内除了有上述的檔案外,還有相應的Debug或Release、Res等子檔案夾。

  具體的圖示可參考p38的圖1.22,也可參考自己應用程式項目的檔案夾。

4. Win32 Debug版本的運作程式

  用Visual C++ 6.0應用程式向導建立項目時,系統會自動為項目建立Win32 Debug的運作程式,并使用相應的預設配置。

  它與Win32 Release版本的差別在于:Debug版本的運作程式有相應的調試資訊碼,以便于程式的調試,而Release版本的運作程式沒有,但Release版本的運作程式經過代碼的優化,其程式的運作速度加快。

5. 讓應用程式可傳遞

選擇“組建”→“移除工程配置”菜單指令,在彈出的對話框中,選擇“Ex_SDI-Win32 Release”,然後單擊“确定”按鈕。重新編連後,可将預設的Win32 Debug版本修改成Win32 Release版本。這樣,在Release檔案夾中的exe檔案就是傳遞使用者的可執行檔案。

三、項目管理和類結構

1. 項目工作區

  作用:①有效地管理項目中的那些檔案;②維護各源檔案之間的依賴關系。

  内容:包含三個頁籤(ClassView類頁面、ResourceView資源頁面、FileView檔案頁面)

2. 應用程式的MFC類結構

  我們使用MFC AppWizard建立一個預設的Windows單文檔應用程式,并命名為“Ex_SDI”。

  将項目工作區視窗切換到ClassView頁籤,可以看到MFC為單文檔應用程式項目Ex_SDI自動建立了類CAboutDlg、CEx_SDIApp、CEx_SDIDoc、CEx_SDIView和CMainFrame。

上面這些類之間的說明如下:

  • CAboutDlg:對話框類,從CDialog類派生的,是每一個應用程式架構都有的,用來顯示本程式的有關資訊。
  • CEx_SDIApp:應用程式類,從CWinApp類派生的,是每一個應用程式架構都有的,負責應用程式的建立、運作和終止。
  • CEx_SDIDoc:應用程式文檔類,從CDocument類派生的,負責應用程式文檔資料管理。
  • CEx_SDIView:應用程式視圖類,既可從基類CView派生,也可從CView派生類(如CListView、CTreeView等)派生,負責資料的顯示、繪制和其他使用者互動。
  • CMainFrame:主架構視窗類,負責主架構視窗的顯示和管理,包括工具欄和狀态欄等界面元素的初始化。對于單文檔應用程式,主架構視窗類是從CFrameWnd派生的。

四、OnDraw和消息添加

1. OnDraw函數

  在應用程式架構中,視圖類用來封裝和管理架構視窗的子視窗,當子視窗無效時,就會自動調用使用者視圖類的OnDraw函數。

  翻譯:子視窗無效→調用視圖類的OnDraw函數

  • OnDraw函數是對WM_PAINT消息的一種映射。故若想在客戶區繪制“Hello MFC!”時,其繪制代碼就應在OnDraw函數中添加(将項目工作區切換到ClassView頁籤,展開CEx_SDIView結點,輕按兩下OnDraw成員函數結點,在定位到的代碼區添加相應的代碼)。

2. 在視圖類中添加單擊滑鼠的消息處理(映射)

  • 彈出MFC ClassWizard對話框→Message Maps(消息映射)頁籤→類名CEx_SDIView→在Objects IDs清單框中標明CEx_SDIView→輕按兩下Messages清單中的(要映射的)WM_LBUTTOMDOWN消息→在CEx_SDIView類中添加該消息的映射函數OnLButtonDown→輕按兩下消息函數(即OnLButtonDown)會定位到OnLButtonDown函數實作的源代碼處→添加相應的代碼
  • 上面的流程便完成了一個消息的添加和映射過程。
  • 讀後感:OnLButtonDown函數是WM_LBUTTOMDOWN消息映射,故當觸發“WM_LBUTTOMDOWN消息”時,程式會執行OnLButtonDown函數内的代碼。

  說明:上述消息的映射遵循前述的MFC消息映射機制,且在代碼中出現了//{{AFX_MSG(…)和//}}AFX_MSG以及//{{AFX_MSG_MAP(…)和//}}AFX_MSG_MAP等特殊标記,它們表示之間的内容由MFC ClassWizard自動管理。

補充:

MFC AppWizard:能為使用者生成一些常用的标準程式結構和程式設計風格,它們被稱為應用程式架構結構。

繼續閱讀