如何在VK_RETURN
控件中处理 Return 键(CEdit
)? CEdit
控件是CDialog
的父级。
答案 0 :(得分:15)
您还可以在对话框的PreTranslateMessage中过滤键。如果WM_KEYDOWN
获得VK_RETURN
,请致电GetFocus
。如果焦点在您的编辑控件上,请在编辑控件中调用您对返回的处理。
请注意if依赖于短路的子句的顺序是有效的。
BOOL CMyDialog::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN &&
pMsg->wParam == VK_RETURN &&
GetFocus() == m_EditControl)
{
// handle return pressed in edit control
return TRUE; // this doesn't need processing anymore
}
return FALSE; // all other cases still need default processing
}
答案 1 :(得分:3)
正确答案是处理WM_GETDLGCODE / OnGetDlgCode消息。在那里,您可以指定您希望所有键都由您的班级处理。
UINT CMyEdit::OnGetDlgCode()
{
return CEdit::OnGetDlgCode() | DLGC_WANTALLKEYS;
}
答案 2 :(得分:2)
确保在控件的对话框资源中设置了编辑控件样式ES_WANTRETURN
答案 3 :(得分:2)
默认情况下, Return 键会关闭MFC对话框。这是因为 Return 键导致调用CDialog
的{{1}}函数。您可以覆盖该函数以拦截 Return 键。我从this article得到了基本的想法(最后参见方法3 )。
首先,确保使用Class Wizard将编辑控件的成员添加到对话框中,例如:
OnOK()
接下来,您可以将以下函数原型添加到对话框的头文件中:
CEdit m_editFind;
然后,您可以将以下实现添加到对话框的 cpp 文件中:
protected:
virtual void OnOK();
请注意:如果您的对话框中有一个确定按钮,其ID为void CMyDialog::OnOK()
{
if(GetFocus() == &m_editFind)
{
// TODO: Add your handling of the Return key here.
TRACE0("Return key in edit control pressed\n");
// Call `return` to leave the dialog open.
return;
}
// Default behavior: Close the dialog.
CDialog::OnOK();
}
,那么它也会调用IDOK
。
如果这会给您带来任何问题,那么您必须将按钮重定向到另一个处理函数。
我在上面提到的the article的方法3 中也描述了如何执行此操作。
答案 4 :(得分:2)
我自己遇到了这个问题。经过一些实验,如果您只是想在返回时执行某项操作(经过一些编辑等)(而不是针对您关注的编辑器),则存在一种简单的方法-我将创建一个不可见的默认按钮,并让它按钮处理“返回”键而不是默认的“确定”按钮(当然,应将“确定”按钮设置为默认键为false)