如何禁用Tab键在对话框中的编辑控件和按钮之间切换焦点?

时间:2013-08-26 12:07:09

标签: mfc

我有对话框,有按钮和编辑框 当编辑控件具有焦点时,如果我按Tab键,它会移动并聚焦按钮 我希望tab键的工作方式不会切换焦点,而是应该作为编辑控件内的标签输入,即输入编辑框作为键。

2 个答案:

答案 0 :(得分:1)

解决方案相当简单,主要包括处理WM_GETDLGCODE消息。这允许控件实现微调键盘处理(以及其他)。

在MFC中,这意味着:

  • CEdit派生自定义控件类。
  • ON_WM_GETDLGCODE消息处理程序宏添加到消息映射中。
  • 实现OnGetDlgCode成员函数,将DLGC_WANTTAB标志添加到返回值。
  • 对话框的控件进行子类化,例如使用DDX_Control功能。

标题文件:

class MyEdit : public CEdit {
protected:
    DECLARE_MESSAGE_MAP()
public:
    afx_msg UINT OnGetDlgCode();
};

实施档案:

BEGIN_MESSAGE_MAP(MyEdit, CEdit)
    ON_WM_GETDLGCODE()
END_MESSAGE_MAP

UINT MyEdit::OnGetDlgCode() {
    UINT value{ CEdit::OnGetDlgCore() };
    value |= DLGC_WANTTAB;
    return value;
}

答案 1 :(得分:-1)

覆盖对话框中的PreTranslateMessage功能,如下所示:

BOOL CTestThreadDlg::PreTranslateMessage( MSG* pMsg )
{
  if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_TAB)
  {
    CWnd* pFocusWnd = GetFocus( );

    if (pFocusWnd != NULL && pFocusWnd->GetDlgCtrlID() == IDC_EDIT2)
    {
      CEdit *pEditCtrl = (CEdit *)pFocusWnd ;
      int start, end ;
      pEditCtrl->GetSel(start, end) ;
      CString str ;
      pEditCtrl->GetWindowText(str) ;
      str = str.Left(start) + _T("\t") + str.Mid(end) ;
      pEditCtrl->SetWindowText(str) ;
      pEditCtrl->SetSel(start + 1, start + 1) ;
    }

    return TRUE ;
  }

  return CDialog::PreTranslateMessage(pMsg) ;
}

在此示例中,我们检查焦点是否在IDC_EDIT2编辑控件中。你可能必须根据自己的情况调整它。