首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 處理 CEdit 控件 WM_KEYDOWN 事件:PreTranslateMessage 實戰

     編輯:VC 教學

為什麼不用 ON_WM_KEYDOWN?

CEdit 等控件擁有**獨立視窗程序**,鍵盤訊息**不會**傳遞給父對話框的 ON_WM_KEYDOWN。必須在**對話框/視圖層級**攔截訊息迴圈前的 PreTranslateMessage。

實作步驟

VC6 (ClassWizard)

  1. 對話框右鍵 → ClassWizard → Message Maps 標籤;
  2. 選擇對話框類別 → Messages 列表找 PreTranslateMessage → Add Function → Edit Code。

VC.NET / VS2005+ (屬性視窗)

  1. 切換到對話框 .cpp 編輯模式;
  2. 屬性視窗 (預設 F4) → Overrides (閃電圖示) → 找 PreTranslateMessage → 雙擊生成。

標準實作範本

BOOL CMyDialog::PreTranslateMessage(MSG* pMsg) {
    // 1. 攔截 WM_KEYDOWN + Enter
    if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN) {
        CWnd* pFocus = GetFocus(); // 取得目前焦點控件
        if (pFocus) {
            // 例:在帳號欄按 Enter → 移至密碼欄
            if (pFocus == GetDlgItem(IDC_EDT_USERNAME)) {
                GetDlgItem(IDC_EDT_PASSWORD)->SetFocus();
                return TRUE; // 訊息已處理,不再分派
            }
            // 例:在密碼欄按 Enter → 觸發登入
            if (pFocus == GetDlgItem(IDC_EDT_PASSWORD)) {
                OnBtnLogin(); // 直接呼叫登入處理
                return TRUE;
            }
        }
    }

    // 2. 其他訊息交給基類 (含 Tab 鍵切換焦點、Esc 關閉等)
    return CDialog::PreTranslateMessage(pMsg);
}

進階應用模式

場景判斷條件處理動作
多行編輯框 Ctrl+Enter 換行pMsg->wParam==VK_RETURN && GetAsyncKeyState(VK_CONTROL)<0插入 \r\n,return TRUE
數字鍵盤 Enter 區分pMsg->wParam==VK_RETURN && (pMsg->lParam>>16)&0xFF == 0x1C視為主鍵盤 Enter
全域熱鍵 (無焦點也生效)在主框架 PreTranslateMessage 判斷RegisterHotKey 更標準
阻止特定按鍵 (如數字鍵)pMsg->wParam>='0' && pMsg->wParam<='9'return TRUE 吞掉

關鍵原則

  • 返回 TRUE = 訊息已處理,停止分派;返回 FALSE = 繼續標準分派;
  • 務必呼叫基類實作處理預設行為 (Tab/快捷鍵/系統鍵);
  • GetFocus() 取得焦點視窗,**不可**用 pMsg->hwnd (那是訊息目標視窗,可能不同);
  • 效能:PreTranslateMessage 極高頻被呼叫,**邏輯必須極簡**,複雜判斷移出函數。

替代方案

  • 子類別化:CEditEx 衍生 CEdit,覆寫 OnKeyDown,再 SubclassDlgItem;
  • WH_GETMESSAGE Hook:全域攔截,過重不建議;
  • Accelerator Table:標準快捷鍵資源,自動轉 WM_COMMAND。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved