Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > ESC


Автор: Гость_gudok 23.8.2003, 15:41
Как сделать , чтобы при нажатии ESC приложение не закрывалось? smile.gif

Автор: RAN 23.8.2003, 17:08
Модератор: Задавая подобные вопросы, пишите более подробно об используемых компиляторах и оболочках (MFC, VCL, API). Ваш вопрос пораждает другие вопросы и до сути мы дойдём топика через три (оффтопика)

Автор: mr.DUDA 23.8.2003, 21:23
скорее всего автор имеет ввиду Dialog-based приложение сделанное в Borland C++ Builder

Автор: Unregistered 24.8.2003, 13:24
mr.DUDA
Почти угадал.
Работаю я в VC++ при помощи MFC.

Автор: RAN 24.8.2003, 13:56
Ну, вот добрались до сути. Посчитай топики smile.gif.
Тебе надо в обрабатывать событие OnKeyDown и отлавливать VK_ESCAPE. Хотя может кто-нибудь другой выход предложит.

Автор: mr.DUDA 24.8.2003, 14:54
Переопредели виртуальную функцию OnCancel в своём диалоге, так чтобы она ничего не делала smile.gif

Это не просто а очень просто:
1) заходишь в ClassWizard
2) выбираешь класс своего диалога в списке "Class name" (например CTestDlg)
3) в списке "Object IDs" выбираешь "IDCANCEL"
4) в списке "Messages" тыцкаешь 2 раза на "BN_CLICKED", жмешь "Ok".

Получили обработчик "OnCancel" для класса "CTestDlg". Всё что нам нужно - закомментировать строку "CDialog::OnCancel", чтобы при нажатии ESC, или "Cancel", или "Alt+F4" диалог не закрывался smile.gif
Код
void CTestDlg::OnCancel()
{
// TODO: Add extra cleanup here

// CDialog::OnCancel();      <------ закомментировали
}

Автор: RAN 24.8.2003, 21:34
Ха, mr.DUDA, я так понял, что крестиком и Alt F4 диалог должен закрываться, а ESC - нет. Я прав, gudok?

Автор: mr.DUDA 24.8.2003, 22:31
Если так, то нужно определить метод PreTranslateMessage для диалога, в котором прописать:
Код
BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
{
    // TODO: Add your specialized code here and/or call the base class
    if((pMsg->message == WM_KEYDOWN || pMsg->message == WM_KEYUP)
        && pMsg->wParam == VK_ESCAPE)
            return FALSE; // не обрабатывать данное сообщение

    return CDialog::PreTranslateMessage(pMsg);
}


ЗЫ, хотя я все-таки думаю, что имелось ввиду именно закрытие окна, а не только реакция на ESC


Автор: Гость_gudok 25.8.2003, 10:17
Всем спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)