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

《VC++ 技術內幕》學習筆記(五):基本事件處理——訊息映射、常見視窗訊息與惡作劇程式

     編輯:VC 教學

MFC 事件處理機制

Windows 以訊息驅動。MFC 透過 訊息映射 將訊息 (如 WM_LBUTTONDOWN) 對應至類別成員函數 (如 OnLButtonDown)。

三要素

  1. 函數原型宣告(標頭檔):afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  2. 函數實作(實作檔):void CMyView::OnLButtonDown(...) { ... }
  3. 訊息映射巨集(實作檔):
    BEGIN_MESSAGE_MAP(CMyView, CView)
        ON_WM_LBUTTONDOWN()
    END_MESSAGE_MAP()
  4. 類別宣告巨集(標頭檔):DECLARE_MESSAGE_MAP()

ClassWizard 自動化

實務上透過 ClassWizard (或 VS 類別向導) 點選訊息自動生成上述代碼,避免手寫錯誤。

140+ 預定義訊息處理函數

MFC 對常見 WM_* 訊息提供 On* 對應函數,完整清單請查閱 MSDN「WM_ Messages」。

五大關鍵生命週期訊息

訊息觸發時機處理函數關鍵注意事項
WM_CREATE視窗建立初期,尚未顯示OnCreate不可呼叫需視窗完全建立的 API;初始化改用 OnInitialUpdate
WM_CLOSE使用者點關閉鈕OnClose可攔截並提示存檔;或覆寫 CDocument::SaveModified
WM_QUERYENDSESSIONWindows 關機/登出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_MOUSEMOVE
  • WM_KEYDOWN / WM_KEYUP / WM_CHAR
  • WM_SETFOCUS / WM_KILLFOCUS
  • WM_TIMER:SetTimer/KillTimer 配合

自訂訊息

  1. 定義 #define WM_MYMSG (WM_USER + 100)
  2. 映射:ON_MESSAGE(WM_MYMSG, OnMyMsg)
  3. 發送:PostMessage(WM_MYMSG, wParam, lParam)
  4. 處理:LRESULT OnMyMsg(WPARAM w, LPARAM l) { ... }

最佳實踐

  • 善用 ClassWizard 管理訊息映射,減少手寫錯誤。
  • 覆寫生命週期函數時務必呼叫基類實作,除非明確要阻斷預設行為。
  • 耗時操作放入背景執行緒,避免阻塞訊息迴圈導致介面無回應。
  • 使用 TRACE 宏輸出診斷資訊至輸出視窗,Release 版自動移除。

理解訊息映射機制與核心生命週期訊息,是 MFC 程式設計穩健應對使用者互動與系統事件的基石。

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