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

MFC SetTimer 不執行 OnTimer:消息映射缺失排查

     編輯:程式設計疑難解答

現象

MFC 對話框調用 `SetTimer` 並編寫了 `OnTimer`,但定時器不觸發,無報錯。

根本原因

消息映射未建立:MFC 通過消息映射宏將 `WM_TIMER` 消息路由到 `OnTimer` 函數。若未在類中聲明 `ON_WM_TIMER()` 或未用 ClassWizard 關聯,消息泵不會調用該函數。

解決步驟

  1. 打開類向導(ClassWizard / Class View 右鍵 Add Event Handler)。
  2. 選擇對話框類,Messages 列表找到 `WM_TIMER`,添加處理函數 `OnTimer`。
  3. 確認生成的代碼包含:
    BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)
        ON_WM_TIMER()
    END_MESSAGE_MAP()
  4. 在 `OnInitDialog` 中調用 `SetTimer(1, 1000, NULL)`(ID=1,間隔 1000ms)。
  5. 實現 `OnTimer`:
    void CMyDialog::OnTimer(UINT_PTR nIDEvent) {
        if (nIDEvent == 1) {
            // 定時任務代碼
        }
        CDialogEx::OnTimer(nIDEvent);
    }

常見疏忽

  • 忘記調用 `SetTimer`(如放在構造函數而非 `OnInitDialog`)。
  • 定時器 ID 衝突(多個定時器用同一 ID)。
  • 在 `OnDestroy` 或 `OnCancel` 中未 `KillTimer` 導致資源洩漏。

總結

MFC 消息驅動機制要求消息映射表完整。定時器不執行 90% 是缺 `ON_WM_TIMER()` 映射條目,補全即可。

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