Как я могу обработать ключ возврата в элементе управления CEdit?

Как я могу обработать ключ Return (VK_RETURN) в элементе управления CEdit? Элемент CEdit основан на CDialog.

Ответ 1

Вы также можете фильтровать ключ в диалоговом окне 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
}

Ответ 2

Удостоверьтесь, что стиль редактирования управления ES_WANTRETURN установлен в ресурсе диалога для элемента управления

Ответ 3

Правильный ответ - обработать WM_GETDLGCODE/OnGetDlgCode сообщение. Там вы можете указать, что вы хотите, чтобы все ключи обрабатывались вашим классом.

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

Ответ 4

По умолчанию клавиша Return закрывает диалог MFC. Это связано с тем, что клавиша Return вызывает функцию CDialog OnOK(). Вы можете переопределить эту функцию, чтобы перехватить клавишу Return. Я получил основную идею от этой статьи (см. Метод 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, то она также вызывается OnOK(). Если это вызывает у вас какие-либо проблемы, вам необходимо перенаправить кнопку на другую функцию обработчика. Как это сделать, также описано в методе 3 статьи, о которой я упомянул выше.