Как я могу обработать ключ Return (VK_RETURN
) в элементе управления CEdit
? Элемент CEdit
основан на CDialog
.
Как я могу обработать ключ возврата в элементе управления CEdit?
Ответ 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 статьи, о которой я упомянул выше.