在MFC對話框中實現「按Enter鍵跳轉到下一個編輯框」,標準做法是設置Tab Order配合重寫`PreTranslateMessage`攔截`VK_RETURN`。本文提供完整實現步驟與代碼。
BOOL CMyDialog::PreTranslateMessage(MSG* pMsg)
{
// 1. 只處理按鍵按下事件
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
{
// 2. 獲取當前焦點控件類名
TCHAR szClassName[256];
::GetClassName(pMsg->hwnd, szClassName, 255);
// 3. 僅在編輯框中攔截Enter
if (_tcscmp(szClassName, _T("Edit")) == 0)
{
// 4. 獲取下一個Tab Order控件
HWND hWndNext = ::GetNextDlgTabItem(m_hWnd, pMsg->hwnd, FALSE);
if (hWndNext)
{
::SetFocus(hWndNext);
return TRUE; // 消息已處理,不再分發
}
}
}
// 4. 其他消息交給基類處理(含默認Enter=默認按鈕、Esc=取消)
return CDialogEx::PreTranslateMessage(pMsg);
}
| 需求 | 實現要點 |
|---|---|
| 多行編輯框Enter換行,Ctrl+Enter跳轉 | 判斷`GetKeyState(VK_CONTROL) < 0`組合鍵 |
| 最後一個編輯框Enter觸發「確定」按鈕 | 檢查`hWndNext`是否為IDOK按鈕,或直接`SendMessage(WM_COMMAND, IDOK)` |
| 跳過只讀/禁用編輯框 | 循環`GetNextDlgTabItem`直到找到可編輯控件 |
MFC鍵盤導航核心:Tab Order定順序,PreTranslateMessage攔截鍵,GetNextDlgTabItem找目標,SetFocus移焦點。