首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC.NET

Visual C++.NET 程式設計講座第二講:MFC 應用程式基礎與類別架構

     編輯:VC.NET

第 1 講:MFC 應用程式基礎與類別架構

本講透過一個簡單的 MFC 應用程式範例,介紹「類別」與「物件」的核心觀念,分析 MFC 程式執行機制與基本類別階層結構,最後示範使用 MFC 應用程式精靈快速建立單一檔案應用程式專案。

一個簡單的 MFC 應用程式

在現代「物件導向」程式設計中,「類別」 是一種新的複雜資料型態:不同於 char、int、float 等基本型別,它不僅能封裝多種基本型別資料 (成員變數),還能封裝處理這些資料的函式 (成員函數)。

建立簡易 MFC 專案步驟

  1. 點選 [開始] 頁面 [新增專案] 或 [檔案] → [新增] → [專案],開啟 [新增專案] 對話框。
  2. 左側 [專案類型] 選 Visual C++ 專案,右側 [範本] 選 Win32 專案。
  3. 專案名稱輸入 Ex_1_SimpMFC,按 [確定] 進入 [Win32 應用程式精靈]。
  4. 左側選 [應用程式設定],[應用程式類型] 選 Windows 應用程式,[附加選項] 勾選 空白專案,按 [完成]。

Win32 應用程式設定
圖 1 Win32 應用程式精靈設定

  1. 在 [方案總管] 右鍵專案名稱選 [加入] → [加入新項目],選 C++ 檔案,名稱輸入 SimpMFC,按 [開啟]。
  2. 輸入以下程式碼:

#include 

class CSimpApp : public CWinApp
{
public:
    virtual BOOL InitInstance();
};

class CMainFrame : public CFrameWnd
{
public:
    CMainFrame()
    {
        Create(NULL, _T("簡單 MFC 視窗"), WS_OVERLAPPEDWINDOW, CRect(0, 0, 640, 480));
    }
};

CSimpApp theApp;

BOOL CSimpApp::InitInstance()
{
    m_pMainWnd = new CMainFrame;
    m_pMainWnd->ShowWindow(m_nCmdShow);
    m_pMainWnd->UpdateWindow();
    m_pMainWnd->MessageBox(_T("你好,歡迎進入 MFC 世界!"));
    return TRUE;
}

SimpMFC.cpp 程式碼
圖 2 SimpMFC.cpp 檔案內容

  1. [方案總管] 右鍵專案選 [屬性],[MFC 的使用] 選 在共用 DLL 中使用 MFC,按 [確定]。
  2. 按 Ctrl+F5 執行,彈出視窗顯示歡迎訊息。

專案屬性頁
圖 3 專案屬性頁設定 MFC 使用方式

執行結果
圖 4 專案執行結果

執行機制與 MFC 類別結構

1. 程式碼分析

  • #include :MFC 類別庫標頭檔。
  • class 關鍵字定義類別,慣例以大寫 C 開頭命名 (如 CSimpApp)。
  • 類別主體定義的函式/變數稱為「成員」:public 為公開成員 (類別外可存取),private 為私有成員 (僅類別內部可存取),預設為 private。
  • 繼承語法:class 派生類別 : 繼承方式 基底類別。CSimpApp 繼承 CWinApp,CMainFrame 繼承 CFrameWnd。預設 public 繼承可使用基底類別所有公開成員。

類別的多樣性:

  • 函式多載:同名函式參數個數或型別不同。
  • 運算子多載:賦予既有運算子新意義。
  • 虛擬函式:以 virtual 宣告,如 InitInstance。基底與派生類別各自定義版本,系統依物件型別決定呼叫哪個版本。

建構函式與解構函式:

  • 建構函式:與類別同名 (如 CMainFrame()),物件建立時自動執行,用於初始化。無回傳型別。
  • Create 函式建立視窗:參數依序為類別名、視窗標題、視窗樣式 (WS_OVERLAPPEDWINDOW 為標準視窗)、大小位置 (CRect)。
  • 解構函式:類別名前加 ~ (如 ~CMainFrame()),物件銷毀時自動執行,無參數無回傳值。

成員函式定義位置:可在類別內定義,或類別外使用作用域運算子 :: (如 CSimpApp::InitInstance)。

關鍵全域指標與函式:

  • m_pMainWnd:MFC 全域指標,指向主視窗物件。
  • MessageBox:CWnd 成員函式,彈出對話框顯示訊息。

2. 執行機制流程

  1. 定義全域物件 CSimpApp theApp 時,先呼叫基底類別 CWinApp 建構函式進行內部初始化。
  2. 自動呼叫派生類別的虛擬函式 InitInstance():

m_pMainWnd = new CMainFrame;        // 建立主視窗物件,呼叫建構函式 -> Create() 建立視窗
m_pMainWnd->ShowWindow(m_nCmdShow); // 顯示視窗
m_pMainWnd->UpdateWindow();         // 更新視窗
m_pMainWnd->MessageBox(...);        // 彈出訊息框
return TRUE;                        // 表示初始化成功
  1. InitInstance 返回後,呼叫基底類別 CWinApp::Run() 進入訊息迴圈:重複「接收訊息 → 轉發訊息」。訊息佇列為空時呼叫 OnIdle 處理背景工作;無訊息無背景工作則等待。
  2. 程式結束時呼叫 CWinApp::ExitInstance() 執行清理工作。

重點:MFC 利用類別「物件建立自動呼叫建構函式」特性,將傳統 WinMain 封裝在架構內部,開發者無需撰寫 WinMain。每個 MFC 應用程式有且只能有一個 CWinApp 派生類別與一個全域物件實例。

3. MFC 基本類別階層結構

MFC 類別階層結構
圖 5 MFC 類別基本階層結構 (箭頭指向基底類別)

類別說明
CObject絕大多數 MFC 類別的根基底類別,提供動態記憶體管理、診斷、序列化支援
CCmdTarget訊息發送/等待/派遣,協調物件間運作
CWinThread執行緒控制 (建立、執行、終止、暫停)
CWinApp應用程式主執行緒類別,繼承自 CWinThread
CDocument文件類別,管理程式執行期間資料
CWnd通用視窗類別,提供 Windows 所有通用特性
CView視圖類別,存取文件並負責顯示
CFrameWnd框架視窗類別,繼承 CWnd,實作標準框架應用程式
CDialog對話框視窗控制
CMDIFrameWnd / CMDIChildWnd多文件應用程式主框架/子視窗
CMiniFrameWnd簡易框架視窗 (無最大化/最小化/系統選單),較少使用

使用 MFC 應用程式精靈

實務上無需手寫上述程式碼,Visual C++ .NET 提供 MFC 應用程式精靈 (MFC AppWizard) 可零程式碼建立完整應用程式架構。

建立單一檔案應用程式 TextViewer 步驟

  1. [新增專案] 選 MFC 應用程式,專案名稱 TextViewer,按 [確定]。
  2. [應用程式類型] 頁面:

應用程式類型頁面
圖 6 應用程式類型設定

  • 選 單一檔案 (Single Document)。
  • 必須勾選 文件/視圖架構支援,否則開啟/儲存檔案等功能需自行實作。
  • MFC 使用方式建議 共用 DLL。

四種基本應用程式類型比較:

類型特性
單一檔案 (SDI)類似記事本,一次只能開啟一個文件,複雜度適中,最常作為開發起點
多文件 (MDI)可同時開啟多個文件,功能豐富但需大量額外程式碼
多最上層文件類似 MDI,但每個文件獨立顯示於桌面,各有工作列按鈕 (如 Office 2000/XP)
以對話框為基礎最簡單緊湊,無選單/工具列/狀態列,無法處理文件,開發除錯最快
  1. [使用者介面功能] 頁面:可調整浮動工具列、主/子框架視窗樣式等。

使用者介面功能
圖 7 使用者介面功能設定

  1. [進階功能] 頁面:可啟用內容相關說明、自動化、列印/預覽、通訊等支援,設定近期檔案清單數量。

進階功能
圖 8 進階功能設定

  1. [產生的類別] 頁面:可修改預設類別名稱、基底類別、原始檔名稱。

產生的類別
圖 9 產生的類別名稱與檔案設定

  1. 按 [完成],專案建立完成。按 Ctrl+F5 執行,呈現具備選單、工具列、狀態列的完整視窗。

TextViewer 執行結果
圖 10 TextViewer 專案執行結果

結語

精靈除上述功能外,還支援資料庫、資源範本字串、複合文件等進階特性。使用 MFC 應用程式精靈可快速建立最常見的應用程式類型。精靈產生的各類別間存在緊密關聯,下一講將依據類別關聯機制,探討文件資料如何被讀取並顯示。

  1. 上一篇文章:
  2. 下一篇文章: No
Copyright © 程式碼之家 All Rights Reserved