按鈕處理器呼叫 SetTimer(2, 1000, NULL),OnTimer(UINT_PTR nIDEvent) 中用 case 2: 處理正常。改為 SetTimer(1, ...) + case 1: 後,OnTimer 不進入。
定時器 ID 在進程內必須唯一。若同一視圖/對話框已有其他地方 (如 OnInitDialog、父類、其他控件) 呼叫 SetTimer(1, ...),後來的 SetTimer(1, ...) 會失敗並返回 0 (不會覆蓋舊定時器)。此時 OnTimer 收到的 nIDEvent 仍是舊定時器的 ID (可能是系統分配的其他值),導致 case 1: 永不匹配。
OnTimer 開頭加入追蹤:
void CMyDlg::OnTimer(UINT_PTR nIDEvent) {
TRACE(_T("OnTimer fired: nIDEvent = %d\n"), nIDEvent); // 輸出到 DebugView/Output 視窗
// ...
}
SetTimer 呼叫,確保 ID 不重複 (建議定義 enum { TIMER_AD_REFRESH = 100, TIMER_DATA_POLL = 101 };)。SetTimer(0, ...) 讓系統自動分配,並保存返回值:
UINT_PTR timerId = SetTimer(0, 1000, NULL); // 返回實際 ID
if (timerId) m_myTimerId = timerId;
OnDestroy / OnCancel 中配對呼叫 KillTimer(id)。CreateTimerQueueTimer (Win32) 或 std::thread + sleep_for。