Как я могу обработать ключ возврата в элементе управления CEdit? - PullRequest
10 голосов
/ 12 февраля 2009

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

Ответы [ 4 ]

15 голосов
/ 13 февраля 2009

Вы также можете отфильтровать ключ в 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
}
3 голосов
/ 17 мая 2011

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

UINT CMyEdit::OnGetDlgCode()
{
    return CEdit::OnGetDlgCode() | DLGC_WANTALLKEYS;
}
2 голосов
/ 21 марта 2017

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

2 голосов
/ 12 февраля 2009

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

...