【发布时间】:2010-10-07 04:41:01
【问题描述】:
如何处理 CEdit 控件中的 Return 键 (VK_RETURN)? CEdit 控件的父级是 CDialog。
【问题讨论】:
如何处理 CEdit 控件中的 Return 键 (VK_RETURN)? CEdit 控件的父级是 CDialog。
【问题讨论】:
确保在控件的对话框资源中设置了编辑控件样式 ES_WANTRETURN
【讨论】:
您还可以过滤对话框的 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
}
【讨论】:
正确答案是处理WM_GETDLGCODE / OnGetDlgCode 消息。在那里你可以指定你希望你的类处理所有的键。
UINT CMyEdit::OnGetDlgCode()
{
return CEdit::OnGetDlgCode() | DLGC_WANTALLKEYS;
}
【讨论】:
默认情况下,Return 键关闭 MFC 对话框。这是因为 Return 键会导致调用 CDialog 的 OnOK() 函数。您可以覆盖该函数以拦截 Return 键。我从this article 得到了基本的想法(见最后的方法3)。
首先,确保您已使用Class Wizard 将编辑控件的成员添加到对话框中,例如:
CEdit m_editFind;
接下来,您可以将以下函数原型添加到对话框的头文件中:
protected:
virtual void OnOK();
然后您可以将以下实现添加到对话框的 cpp 文件中:
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();
}
请注意:如果您的对话框中有一个 OK 按钮,其 ID 为 IDOK,那么它也会调用 OnOK()。
如果这对您造成任何问题,那么您必须将按钮重定向到另一个处理函数。
如何做到这一点在我上面提到的the article的方法3中也有描述。
【讨论】:
我自己也遇到过这个问题。经过一些实验后,如果您只想在返回时执行某些操作(经过一些编辑等)(不特定于您所关注的编辑器),则存在一种简单的方法 - 我将创建一个不可见的默认按钮,然后让它按钮处理'return'键而不是默认的Ok按钮(当然,Ok按钮应该设置默认键为false)
【讨论】: