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

Posted

技术标签:

【中文标题】如何禁止tab键在对话框内的编辑控件和按钮之间切换焦点?【英文标题】:How to disallow tab key to switch focus between edit control and button within dialog box? 【发布时间】:2013-08-26 12:07:08 【问题描述】:

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

【问题讨论】:

codeguru.com/cpp/controls/editctrl/keyboard/article.php/c513/… 让编辑控件设置DLGC_WANTTAB 标志以响应WM_GETDLGCODE 【参考方案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;

【讨论】:

【参考方案2】:

像这样覆盖对话框中的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 编辑控件中。您可能必须根据自己的情况调整它。

【讨论】:

你太努力了。只需让编辑控件回复DLGC_WANTTAB 说“将标签发送给我而不是使用它们进行导航”。这也修复了即使用户按下 Shift+Tab 或 Ctrl+Tab,您的代码也会插入选项卡的错误。 @Raymond Chen,你能帮我在下面的帖子***.com/questions/18479791/… 不要为同一件事创建两个问题。 你试过DLGC_WANTALLKEYS吗?

以上是关于如何禁止tab键在对话框内的编辑控件和按钮之间切换焦点?的主要内容,如果未能解决你的问题,请参考以下文章

vc++ 关于对话框上标签(TAB)控件的使用问题

Python Kivy 在 Popup 内的按钮之间切换

在 UserControl WPF MVVM caliburn 内的 UserControl 之间切换

Visual C++编程技巧之五

mfc 选项卡控制切换选项卡

驻留在制表符控件内的控件的制表位顺序?