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

VC++ 精華教程:MFC 入門系列(二)—— 深入理解消息映射機制

     編輯:VC++

作者:zhoujiamurong | 郵箱:zhoujiamurong@163.com
版權所有,轉載請聯繫作者。

前言

繼上一篇介紹 MFC 核心類 CWinApp 和 CFrameWnd 後,本節將深入講解 MFC 的核心機制——消息映射。這是 MFC 區別於傳統 SDK 開發的關鍵特性,掌握它才能真正理解 MFC 如何處理 Windows 消息。

從 SDK 到 MFC:消息處理的演進

在傳統 SDK 開發中,所有消息都由 WndProc 統一處理,通過巨大的 switch-case 結構判斷消息類型(如 WM_COMMAND、WM_LBUTTONDOWN 等),再分發到具體處理邏輯。這種方式雖然直觀,但隨著消息類型增加,代碼會變得極其臃腫且難以維護。

MFC 巧妙地將這一過程封裝為消息映射宏,將消息與處理函數建立一一對應關係,實現了「聲明與實現分離」的清晰架構。

核心宏解析

MFC 提供四個關鍵宏構建消息映射體系:

  • DECLARE_MESSAGE_MAP:在類中聲明消息映射表
  • BEGIN_MESSAGE_MAP / END_MESSAGE_MAP:定義映射表的開始與結束
  • ON_COMMAND / ON_WM_XXX:具體消息與處理函數的綁定宏

這些宏本質上是嵌套的宏定義,展開後會生成查找表與分發函數。初學者只需掌握使用規則,無需深究展開細節。

實戰:響應鼠標左鍵點擊

以下代碼演示如何在 CFrameWnd 派生類中添加鼠標左鍵按下的響應:

#include <afxwin.h>

class CMainFrame : public CFrameWnd {
public:
    CMainFrame() {
        Create(NULL, _T("MFC Window"));
        MessageBox(_T("My MFC Window"), _T("CFrame Constructor"), MB_OK);
    }

    // 消息處理函數:參數固定為 UINT nFlags, CPoint point
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point) {
        ::MessageBox(NULL, _T("左鍵按下"), _T("消息"), MB_OK);
    }

    DECLARE_MESSAGE_MAP()
};

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    ON_WM_LBUTTONDOWN()  // 將 WM_LBUTTONDOWN 映射到 OnLButtonDown
END_MESSAGE_MAP()

class CMyApp : public CWinApp {
public:
    virtual BOOL InitInstance() {
        MessageBox(0, _T("My MFC Window"), _T("InitInstance"), MB_OK | MB_ICONASTERISK);
        CMainFrame* pFrame = new CMainFrame;
        m_pMainWnd = pFrame;
        pFrame->ShowWindow(SW_SHOWMAXIMIZED);
        return TRUE;
    }
    virtual BOOL ExitInstance() {
        MessageBox(0, _T("My Window"), _T("ExitInstance"), MB_OK | MB_ICONHAND);
        return TRUE;
    }
};

CMyApp theApp;

關鍵點總結

  1. 處理函數簽名固定:如 OnLButtonDown(UINT, CPoint),不可隨意更改參數類型或順序。
  2. 映射宏與函數名約定:系統消息(如 WM_LBUTTONDOWN)對應的宏(ON_WM_LBUTTONDOWN)會自動尋找名為 OnLButtonDown 的成員函數。
  3. 聲明與實現分離:類內用 DECLARE_MESSAGE_MAP 聲明,類外用 BEGIN/END_MESSAGE_MAP 實現,結構清晰。

掌握消息映射是 MFC 開發的基石,下一節我們將探討資源文件的使用,為程序添加菜單、圖標等界面元素。

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