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

MFC 訊息映射機制深度解析:標準訊息、命令訊息、通知訊息與範圍巨集

     編輯:VC 教學

三類 Windows 訊息

  1. 標準訊息:WM_* 前綴 (除 WM_COMMAND),如 WM_MOVE、WM_QUIT。由 CWnd 派生類處理。
  2. 命令訊息:WM_COMMAND,攜帶命令 ID。處理範圍最廣:CWnd、CDocument、CDocTemplate、CWinApp 均可處理。
  3. 控制項通知:同為 WM_COMMAND,但含通知碼 (如 BN_CLICKED),由子視窗發送給父視窗。

訊息映射基本架構

// .h
class CMyClass : public CBase {
    DECLARE_MESSAGE_MAP()
    afx_msg void OnSomeMessage(); // 處理函式宣告
};

// .cpp
BEGIN_MESSAGE_MAP(CMyClass, CBase)
    ON_COMMAND(ID_MY_CMD, OnSomeMessage)
    // 其他映射項...
END_MESSAGE_MAP()

void CMyClass::OnSomeMessage() { ... } // 實作

命令訊息進階:ON_COMMAND_RANGE

連續 ID 共用單一處理器:

// .cpp 映射表中
ON_COMMAND_RANGE(ID_CMD_FIRST, ID_CMD_LAST, OnDoSomething)

// .h 宣告
afx_msg void OnDoSomething(UINT nID); // 參數接收實際命令 ID

// .cpp 實作
void CMyClass::OnDoSomething(UINT nID) {
    switch (nID) { case ID_CMD_FIRST: ... }
}

同理 ON_UPDATE_COMMAND_UI_RANGE 處理連續 ID 的 UI 更新,處理函式原型 void OnUpdateSomething(CCmdUI* pCmdUI),pCmdUI->m_nID 可取得 ID。

WM_NOTIFY 通知訊息處理

ClassWizard 產生 ON_NOTIFY:

ON_NOTIFY(LVN_KEYDOWN, IDC_LIST1, OnKeydownList1)
// 處理函式
void CMyDlg::OnKeydownList1(NMHDR* pNMHDR, LRESULT* pResult) {
    LPNMLVKEYDOWN pLV = (LPNMLVKEYDOWN)pNMHDR; // 轉型存取擴充欄位
    *pResult = 0;
}

連續 ID 控制項共用通知處理器:

ON_NOTIFY_RANGE(LVN_KEYDOWN, IDC_FIRST, IDC_LAST, OnKeydownRange)
// 原型
afx_msg void OnKeydownRange(UINT id, NMHDR* pNMHDR, LRESULT* pResult);

手動添加映射項注意事項

  • 映射項放在 //}}AFX_MSG_MAP 註解外側,避免 ClassWizard 覆蓋。
  • 處理函式宣告放在 //}}AFX_MSG 外側,並加 afx_msg 前綴。
  • 函式名慣例以 On 開頭。

結語

掌握訊息分類、映射巨集語法與範圍處理技巧,即可在 ClassWizard 無能為力時靈活應對複雜訊息路由需求。

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