ENTER и ESC в диалоговом окне
От: sir171  
Дата: 22.08.06 16:02
Оценка:
Подскажите, пожалуйста, как решить следующую проблему.

Сделал главное окно диалоговым:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAINWINDOW), NULL, MainWindowDlgProc);
return 0;
}

Как сделать так, чтобы по нажатию ENTER или ESC диалоговое окно не закрывалось?

В диалоговой процедуре MainWindowDlgProc() WM_KEYDOWN проходит для большинства клавиш, но не для ENTER и ESC. Насколько я понимаю их обрабатывает встроенная в виндовскую библиотеку функция dialog box manager (см. MSDN : Dialog Box Keyboard Interface) и переводит их в WM_COMMAND (IDOK или IDCANCEL). Поэтому внутри MainWindowDlgProc() нажатие на ENTER или ESC отловить нельзя. Где и как это можно сделать?

Хотелось бы, чтобы окно закрывалось только по Alt+F4 или крестику.
Re: ENTER и ESC в диалоговом окне
От: opendx  
Дата: 22.08.06 16:39
Оценка:
Здравствуйте, sir171, Вы писали:

S>Как сделать так, чтобы по нажатию ENTER или ESC диалоговое окно не закрывалось?


Смотри виртуальные методы OnOK() и OnCancel() — переопредели их и не вызывай соответствующие функции базового класса.
Re: ENTER и ESC в диалоговом окне
От: BuHHunyx Беларусь  
Дата: 22.08.06 16:57
Оценка:
Здравствуйте, sir171, Вы писали:

S>Подскажите, пожалуйста, как решить следующую проблему.


[]

Лови сам IDOK и IDCANCEL и не вызывай EndDialog()
Re[2]: ENTER и ESC в диалоговом окне
От: sir171  
Дата: 22.08.06 17:18
Оценка:
Здравствуйте, BuHHunyx, Вы писали:

BHH>Лови сам IDOK и IDCANCEL и не вызывай EndDialog()


Но как тогда поймать ALT+F4 и закрытие по нажатию крестика, чтобы все-таки закрыть? Они тоже генерируют IDOK и IDCANCEL.
Re[2]: ENTER и ESC в диалоговом окне
От: sir171  
Дата: 22.08.06 17:22
Оценка:
Здравствуйте, opendx, Вы писали:

O>Смотри виртуальные методы OnOK() и OnCancel() — переопредели их и не вызывай соответствующие функции базового класса.


Это напоминает MFC. Я MFC не использую, хотя там все эти проблемы легко решаются в PreTranslateMessage().
Что-то похожее должно быть в Win32API. Вот только что???

Где в Win32API посмотреть виртуальные методы OnOK() и OnCancel() ?
Re: ENTER и ESC в диалоговом окне
От: sir171  
Дата: 22.08.06 21:01
Оценка:
S>Хотелось бы, чтобы окно закрывалось только по Alt+F4 или крестику.

Всё, сделал. В диалоговой процедуре нужно прописать:

    case WM_SYSCOMMAND:
        if (wParam == SC_CLOSE)    //выход по Alt+F4 или крестику
        {
            EndDialog(hDlg, IDCANCEL);
            return TRUE;
        }
        break;

    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDOK:    //не выходить на ENTER
        case IDCANCEL:    //не выходить на ESC
            return TRUE;
        }
        break;


Всем спасибо! Тема закрыта.
Re[2]: ENTER и ESC в диалоговом окне
От: sir171  
Дата: 22.08.06 21:32
Оценка:
S>Всем спасибо! Тема закрыта.

Можно еще проще:
    case WM_CLOSE:
        EndDialog(hDlg, IDCANCEL);
        return TRUE;
Re: ENTER и ESC в диалоговом окне
От: sraider http://dvinogradov.blogspot.com
Дата: 23.08.06 11:29
Оценка:
S>Как сделать так, чтобы по нажатию ENTER или ESC диалоговое окно не закрывалось?

S>В диалоговой процедуре MainWindowDlgProc() WM_KEYDOWN проходит для большинства клавиш, но не для ENTER и ESC. Насколько я понимаю их обрабатывает встроенная в виндовскую библиотеку функция dialog box manager (см. MSDN : Dialog Box Keyboard Interface) и переводит их в WM_COMMAND (IDOK или IDCANCEL). Поэтому внутри MainWindowDlgProc() нажатие на ENTER или ESC отловить нельзя. Где и как это можно сделать?


S>Хотелось бы, чтобы окно закрывалось только по Alt+F4 или крестику.


В диалоговых окнах ESC и ENTER обрабатываются до WindowDlgProc() — в цикле сообщений, внутри IsDialogMessage().

Почитай Dialog Box Overview в MSDN, раздел Dialog Box Keyboard Interface:
ENTER Sends a WM_COMMAND message to the dialog box procedure. The wParam parameter is set to IDOK or control identifier of the default push button.
ESC Sends a WM_COMMAND message to the dialog box procedure. The wParam parameter is set to IDCANCEL.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.