首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MFC 入門:按鈕消息映射與事件處理器生成全流程

     編輯:程式設計綜合問答

MFC 通過**消息映射**機制將 Windows 消息(如 `BN_CLICKED`)路由到 C++ 成員函數。新手常見疑惑:「代碼寫在哪?怎麼和按鈕關聯?」

兩種生成處理器的方式

方式一:資源編輯器雙擊(最直觀)

  1. 打開對話框資源 (`*.rc` → Dialog)。
  2. 雙擊按鈕控件(`IDC_BUTTON1`)。
  3. 彈出「添加成員函數」對話框,確認消息類型為 `BN_CLICKED`,函數名如 `OnBnClickedButton1`。
  4. 點擊確定,VS 自動在對話框類(`CMyDialog`)中聲明並生成存根:
// MyDialog.h
afx_msg void OnBnClickedButton1();

// MyDialog.cpp
void CMyDialog::OnBnClickedButton1() {
    // TODO: 在此添加控件通知處理程序代碼
    MessageBox(_T("按鈕被點擊!"));
}

方式二:類向導 (Class Wizard) - Ctrl+W

  1. 在類視圖中右鍵對話框類 → 「類向導」。
  2. 「消息映射」頁籤:左側「類名」選當前類,中間「控件 ID」選 `IDC_BUTTON1`,右側「消息」勾選 `BN_CLICKED`。
  3. 點擊「添加函數」→「編輯代碼」。

適用於:給現有控件補充消息、批量添加、非對話框類(如 `CView`、`CFrameWnd`)。

消息映射宏原理

BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)
    ON_BN_CLICKED(IDC_BUTTON1, &CMyDialog::OnBnClickedButton1)
END_MESSAGE_MAP()

運行時:用戶點擊按鈕 → 系統發送 `WM_COMMAND` (LOWORD=IDC_BUTTON1, HIWORD=BN_CLICKED) → MFC 遍歷消息映射表 → 匹配調用 `OnBnClickedButton1`。

常見坑點

  • ❌ 手寫函數忘記 `afx_msg` 聲明、忘記加入 `MESSAGE_MAP`。
  • ❌ 控件 ID 衝突(複製粘貼導致),資源視圖中檢查 ID 唯一性。
  • ❌ 按鈕屬性 `Notify` 未勾選(預設開啟),導致不發送 `BN_CLICKED`。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved