Ответ 1
Когда пользователь нажимает клавишу Enter в диалоговом окне, могут произойти две вещи:
- Диалог имеет элемент управления по умолчанию (см.
CDialog::SetDefID()
). Затем в диалог отправляется WM_COMMAND с идентификатором этого элемента управления. - В диалоговом окне отсутствует элемент управления по умолчанию. Затем в диалог отправляется WM_COMMAND с ID = IDOK.
При первом варианте может оказаться, что элемент управления по умолчанию имеет ID, равный IDOK. Тогда результаты будут такими же, что и во втором варианте.
По умолчанию класс CDialog
имеет обработчик для WM_COMMAND(IDOK)
, который должен вызвать CDialog::OnOk()
, то есть виртуальную функцию, и по умолчанию он вызывает EndDialog(IDOK)
, который закрывает диалог.
Итак, если вы хотите избежать закрытия диалогового окна, выполните одно из следующих действий.
- Установите для элемента управления по умолчанию значение, отличное от
IDOK
. - Установите обработчик
WM_COMMAND(IDOK)
, который не вызываетEndDialog()
. - Переопределить
CDialog::OnOk()
и не вызывать базовую реализацию.
О IDCANCEL, это похоже, но нет эквивалента SetDefID()
, а клавиша ESC жестко запрограммирована. Чтобы избежать закрытия диалогового окна:
- Установите обработчик для
WM_COMMAND(IDCANCEL)
, который не вызываетEndDialog()
. - Переопределить
CDialog::OnCancel()
и не вызывать базовую реализацию.