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

时间:2009-02-12 14:50:18

标签: c++ windows mfc cedit

如何在VK_RETURN控件中处理 Return 键(CEdit)? CEdit控件是CDialog的父级。

5 个答案:

答案 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)