WM_* 前綴 (除 WM_COMMAND),如 WM_MOVE、WM_QUIT。由 CWnd 派生類處理。WM_COMMAND,攜帶命令 ID。處理範圍最廣:CWnd、CDocument、CDocTemplate、CWinApp 均可處理。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() { ... } // 實作
連續 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。
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 無能為力時靈活應對複雜訊息路由需求。