我有带有按钮和编辑框的对话框。
当编辑控件具有焦点时,如果我按 Tab 键,它会移动并聚焦按钮。
我希望tab键以这样的方式工作,它不会切换焦点,而是应该作为编辑控件内的tab输入,即作为键输入到编辑框。
问问题
1752 次
2 回答
2
解决方案相当简单,主要包括处理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;
}
于 2017-02-20T19:00:32.330 回答
-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 编辑控件中。您可能必须根据您的情况进行调整。
于 2013-08-26T13:03:21.700 回答