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

MFC 按鈕釋放後將焦點移至編輯框:PreTranslateMessage 捕獲 WM_LBUTTONUP 並 SetFocus

     編輯:程式設計綜合問答

需求:用戶點擊按鈕並釋放鼠標左鍵後,焦點自動移至編輯框 IDC_EDIT1 並顯示閃爍光標。

實現方案:重寫 PreTranslateMessage

BOOL CMyDialog::PreTranslateMessage(MSG* pMsg) {
    if (pMsg->message == WM_LBUTTONUP) {
        // 獲取鼠標釋放時光標下的控件 ID
        CWnd* pWnd = ChildWindowFromPoint(pMsg->pt);
        if (pWnd) {
            int nID = pWnd->GetDlgCtrlID();
            if (nID == IDC_BUTTON1) { // 目標按鈕 ID
                // 設置焦點到編輯框
                CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);
                if (pEdit) {
                    pEdit->SetFocus();
                    return TRUE; // 消息已處理
                }
            }
        }
    }
    return CDialogEx::PreTranslateMessage(pMsg);
}

關鍵點

  1. WM_LBUTTONUP:鼠標左鍵釋放消息,對應「點擊完成」動作。
  2. ChildWindowFromPoint:根據屏幕坐標 pMsg->pt 找到子控件 (需轉客戶區坐標或用 ScreenToClient)。
  3. GetDlgCtrlID:確認是目標按鈕。
  4. CEdit::SetFocus:將鍵盤焦點移至編輯框,自動顯示插入符 (閃爍光標)。
  5. 返回 TRUE:阻止默認處理 (如按鈕自身的焦點行為)。

替代方案:按鈕 BN_CLICKED 處理器

void CMyDialog::OnBnClickedButton1() {
    // 按鈕點擊響應 (按下並釋放在客戶區內觸發)
    GetDlgItem(IDC_EDIT1)->SetFocus();
}
  • 更簡單,BN_CLICKED 本身即代表完整點擊動作 (按下+釋放在控件內)。
  • 若需在「釋放」瞬間而非「點擊確認」瞬間轉移焦點,用 PreTranslateMessage + WM_LBUTTONUP。

推薦使用 ON_BN_CLICKED 處理器 + SetFocus(),代碼最少、語義最清晰。

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