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

Mfc 如何禁止tab键在对话框中的编辑控件和按钮之间切换焦点?,mfc,Mfc,我有一个包含按钮和编辑框的对话框。 当编辑控件具有焦点时,如果我按tab键,它将移动并聚焦按钮。 我希望tab键的工作方式使其不会切换焦点,而应在编辑控件内作为tab输入,即作为键输入到编辑框。覆盖对话框中的功能,如下所示: BOOL CTestThreadDlg::PreTranslateMessage( MSG* pMsg ) { if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_TAB) {

我有一个包含按钮和编辑框的对话框。
当编辑控件具有焦点时,如果我按tab键,它将移动并聚焦按钮。
我希望tab键的工作方式使其不会切换焦点,而应在编辑控件内作为tab输入,即作为键输入到编辑框。

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

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编辑控件中。您可能必须根据自己的情况调整此选项。

解决方案相当简单,基本上包括处理消息。这允许控件实现微调键盘处理(除其他外)

在MFC中,这意味着:

  • 从派生自定义控件类
  • 将消息处理程序宏添加到消息映射中
  • 实现成员函数,将
    DLGC\u WANTTAB
    标志添加到返回值
  • 对对话框控件进行子类化,例如使用函数
头文件:

class MyEdit:public CEdit{
受保护的:
声明消息映射()
公众:
afx_msg UINT OnGetDlgCode();
};
实施文件:

BEGIN\u MESSAGE\u映射(MyEdit,CEdit)
关于_WM_GETDLGCODE()
结束消息映射
UINT MyEdit::OnGetDlgCode(){
UINT值{CEdit::OnGetDlgCore()};
值|=DLGC_WANTTAB;
返回值;
}

让编辑控件设置
DLGC\u WANTTAB
标志,以响应
WM\u GETDLGCODE
。您太努力了。只需让编辑控件响应“将选项卡发送给我,而不是将其用于导航”即可。这也修复了代码插入选项卡的错误,即使用户按下Shift+tab或Ctrl+tab键。@Raymond Chen,你能在下面的帖子上帮我吗?不要为同一件事提出两个问题。你试过了吗?