我如何处理CEdit控件中的Return键?

我如何处理CEdit控件中的返回键( VK_RETURN )? CEdit控件是父对象CDialog

Solutions Collecting From Web of "我如何处理CEdit控件中的Return键?"

您也可以在对话框的PreTranslateMessage中筛选键。 如果您为VK_RETURN获取WM_KEYDOWN ,请调用GetFocus 。 如果焦点位于编辑控件上,请在编辑控件中调用您的处理以返回按下。

注意短路的条款的顺序是有效的。

 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 } 

确保编辑控件样式ES_WANTRETURN在控件的对话框资源中设置

正确的答案是处理WM_GETDLGCODE / OnGetDlgCode消息。 在那里你可以指定你想让所有的键都被你的类处理。

 UINT CMyEdit::OnGetDlgCode() { return CEdit::OnGetDlgCode() | DLGC_WANTALLKEYS; } 

默认情况下, Return键关闭MFC对话框。 这是因为Return键导致CDialogOnOK()函数被调用。 您可以重写该函数以拦截返回键。 我从这篇文章中得到了基本的想法(最后见方法3 )。

首先,请确保您已使用类向导向对话框中添加了编辑控件的成员,例如:

 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(); } 

请注意:如果在IDOK对话框中有一个OK按钮,那么它也会调用OnOK() 。 如果这对您造成任何问题,那么您必须将按钮重定向到另一个处理函数。 如何做到这一点也在我上面提到的文章的 方法3中描述。