在資料輸入密集型對話框中,使用者習慣按 Enter 鍵依 Tab Order 切換至下一個控制項,而非觸發預設按鈕(IDOK)。
PreTranslateMessage 訊息處理:
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg) {
// 按下 Enter 且焦點不在 OK 按鈕時,轉發為 Tab 鍵
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN) {
if (GetFocus()->GetDlgCtrlID() != IDOK) {
pMsg->wParam = VK_TAB; // 關鍵:修改訊息參數
}
}
return CDialog::PreTranslateMessage(pMsg);
}
PreTranslateMessage 是訊息進入 TranslateMessage/DispatchMessage 前的最後攔截點pMsg->wParam 從 VK_RETURN 為 VK_TAB,MFC 內部焦點切換邏輯會自動處理後續流程IDOK 上的 Enter 行為,符合標準對話框慣例
// 允許多行編輯框 (ES_MULTILINE) 內換行,其他控制項 Enter 跳焦點
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN) {
CWnd* pFocus = GetFocus();
if (pFocus->GetDlgCtrlID() != IDOK) {
// 檢查是否為多行編輯框
DWORD style = GetWindowLong(pFocus->m_hWnd, GWL_STYLE);
if (!(style & ES_MULTILINE)) {
pMsg->wParam = VK_TAB;
}
}
}
無需子類別化控制項、無需處理 WM_COMMAND 或 WM_NOTIFY,三行核心程式碼即可實現專業級的鍵盤導航體驗。