Как остановить закрытие приложения диалога MFC, нажав ESC - PullRequest
3 голосов
/ 16 июня 2009

Как я могу остановить закрытие приложения MFC, нажав ESC (клавиша Escape) После выполнения моего заявления, если я нажимаю клавишу ESC, окно закрывается. Как это можно остановить? Я использую VC ++ 6.0.

Ответы [ 4 ]

4 голосов
/ 16 июня 2009

Вы можете переопределить событие OnCancel и двигаться вперед только с помощью вызова OnCancel, если IDCANCEL является целевым элементом.

void CMyDialog::OnCancel(void)
{
   if(GetDlgItem(IDCANCEL) ==  GetFocus())
    {  
        CDialog::OnCancel();
        return;
    }
}
2 голосов
/ 16 июня 2009

Есть разные способы сделать это. Вы можете:

  1. Создайте обработчик OnCancel и делайте все, что вы хотите с уведомлением об отмене
  2. Вы можете обрабатывать событие OnClose и делать все, что захотите.
  3. Вы можете переопределить PreTranslateMessage и проверить клавишу Esc там и делать все, что вы хотите.

Проверьте это для примеров кода.

Для примера PreTranslateMessage см. this

1 голос
/ 17 июня 2009

Переопределение OnCancel и не вызывают реализацию базового класса.

Не приближайтесь к OnClose, если вы не знаете, что делаете, вы рискуете нарушить поведение Alt-F4 и кнопки X.

Я всегда считал, что PreTranslateMessage для таких вещей, как использование термоядерного оружия, чтобы сломать орех, но если он плавает на вашей лодке ...

0 голосов
/ 21 июня 2019

Предполагая, что мы имеем дело с окном верхнего уровня, реализованным здесь как подкласс CDialog, это окно может получать два "вида" событий закрытия:

  • События закрытия приложения (WM_SYSCOMMAND с идентификатором SC_CLOSE)
  • События закрытия окна (WM_COMMAND с идентификатором IDOK или IDCANCEL)

MFC, однако, эффективно направляет прежний класс событий через CDialog :: OnCancel по умолчанию, когда они отправляются в диалог, что означает, что переопределение OnCancel также прерывает Alt-F4 и кнопку X Это означает, что для того, чтобы различать два, вам нужно обрабатывать первые события в OnSysCommand, используя переопределения OnOK и OnCancel для обработки последних.

Полученный код выглядит примерно так:

class CTopLevelDlg: public CDialog
{
  afx_win void OnSysCommand(UINT id, LPARAM lparam) override
  {
    if (id == SC_CLOSE)
      CDialog::OnCancel();
  }
  void OnOK() override {}
  void OnCancel() override {}
};
...