作者:zhoujiamurong | 郵箱:zhoujiamurong@163.com
版權所有,轉載請聯繫作者。
繼上一篇介紹 MFC 核心類 CWinApp 和 CFrameWnd 後,本節將深入講解 MFC 的核心機制——消息映射。這是 MFC 區別於傳統 SDK 開發的關鍵特性,掌握它才能真正理解 MFC 如何處理 Windows 消息。
在傳統 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;
OnLButtonDown(UINT, CPoint),不可隨意更改參數類型或順序。WM_LBUTTONDOWN)對應的宏(ON_WM_LBUTTONDOWN)會自動尋找名為 OnLButtonDown 的成員函數。DECLARE_MESSAGE_MAP 聲明,類外用 BEGIN/END_MESSAGE_MAP 實現,結構清晰。掌握消息映射是 MFC 開發的基石,下一節我們將探討資源文件的使用,為程序添加菜單、圖標等界面元素。