Подскажите, пожалуйста, как решить следующую проблему.
Сделал главное окно диалоговым:
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 или крестику.
Здравствуйте, opendx, Вы писали:
O>Смотри виртуальные методы OnOK() и OnCancel() — переопредели их и не вызывай соответствующие функции базового класса.
Это напоминает MFC. Я MFC не использую, хотя там все эти проблемы легко решаются в PreTranslateMessage().
Что-то похожее должно быть в Win32API. Вот только что???
Где в Win32API посмотреть виртуальные методы OnOK() и OnCancel() ?
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;
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.