Windows 以訊息驅動。MFC 透過 訊息映射 將訊息 (如 WM_LBUTTONDOWN) 對應至類別成員函數 (如 OnLButtonDown)。
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);void CMyView::OnLButtonDown(...) { ... }BEGIN_MESSAGE_MAP(CMyView, CView)
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()
DECLARE_MESSAGE_MAP()實務上透過 ClassWizard (或 VS 類別向導) 點選訊息自動生成上述代碼,避免手寫錯誤。
MFC 對常見 WM_* 訊息提供 On* 對應函數,完整清單請查閱 MSDN「WM_ Messages」。
| 訊息 | 觸發時機 | 處理函數 | 關鍵注意事項 |
|---|---|---|---|
| WM_CREATE | 視窗建立初期,尚未顯示 | OnCreate | 不可呼叫需視窗完全建立的 API;初始化改用 OnInitialUpdate |
| WM_CLOSE | 使用者點關閉鈕 | OnClose | 可攔截並提示存檔;或覆寫 CDocument::SaveModified |
| WM_QUERYENDSESSION | Windows 關機/登出 | OnQueryEndSession | 返回 FALSE 可取消關機;緊接著送 WM_ENDSESSION |
| WM_DESTROY | 視窗銷毀前 | OnDestroy | 清理依賴視窗的資源;必須呼叫基類 OnDestroy;終止析構在 OnClose |
| WM_NCDESTROY | 視窗完全銷毀後 | OnNcDestroy | 最終清理;必須呼叫基類 OnNcDestroy |
void CMy007View::OnDraw(CDC* pDC)
{
pDC->TextOut(100, 100, _T("請不要單擊滑鼠右鍵,否則後果自負!"));
}
void CMy007View::OnRButtonDown(UINT nFlags, CPoint point)
{
::MessageBox(NULL, _T("你確定要這樣做嗎?"), _T("警告"), MB_OK);
::ExitWindows(); // 強制登出/關機(慎用!)
}
訊息映射:ON_WM_RBUTTONDOWN()
WM_LBUTTONDOWN / WM_RBUTTONDOWN / WM_MOUSEMOVEWM_KEYDOWN / WM_KEYUP / WM_CHARWM_SETFOCUS / WM_KILLFOCUSWM_TIMER:SetTimer/KillTimer 配合#define WM_MYMSG (WM_USER + 100)ON_MESSAGE(WM_MYMSG, OnMyMsg)PostMessage(WM_MYMSG, wParam, lParam)LRESULT OnMyMsg(WPARAM w, LPARAM l) { ... }TRACE 宏輸出診斷資訊至輸出視窗,Release 版自動移除。理解訊息映射機制與核心生命週期訊息,是 MFC 程式設計穩健應對使用者互動與系統事件的基石。