Как использовать клавишу Enter в немодальном диалоге?
Я работал над проектом WinAPI для университета, и нас просят реализовать полную программу в диалоговом окне. Сначала я использовал модальное диалоговое окно, и все работало нормально, за исключением того, что на панели задач не было значка для диалогового окна, потому что я создал его непосредственно в WM_CREATE и все равно не делал главное окно видимым, поскольку оно не используемый.
Теперь я полностью сбросил дескриптор главного окна и использовал только CreateDialog
для создания немодального диалога, но с тех пор я не могу использовать этот Enter ключ в качестве альтернативы моей кнопке по умолчанию.
case WM_COMMAND:
if(LOWORD(wparam) == IDOK || LOWORD(wparam) == IDC_OK) {
[...] //doing stuff
}
break;
и это моя основная основная функция:
int WINAPI WinMain(HINSTANCE dieseInstanz, HINSTANCE vorherigeInstanz, LPSTR lpszArgument, int Fensterstil) {
MSG Meldung;
HWND dialog = NULL;
dialog = CreateDialog(GetModuleHandle(NULL),MAKEINTRESOURCE(IDC_DIALOG), NULL, dialogHandler);
if(dialog != NULL) {
ShowWindow(dialog, SW_SHOW);
} else {
MessageBox(NULL, "CreateDialog returned NULL", "Warning!", MB_OK | MB_ICONINFORMATION);
}
while(GetMessage(&Meldung, NULL, 0, 0)) {
TranslateMessage(&Meldung);
DispatchMessage(&Meldung);
}
return Meldung.wParam;
}
Я просто сделал что-то не так, или все работает не так, как я хочу?
Чтобы уточнить: если я нажимаю Enter клавишу в своем диалоговом окне, я получаю только обычный звук уведомления Windows.
1 ответ
Ваш цикл сообщений должен включать вызов IsDialogMessage()
:
Определяет, предназначено ли сообщение для указанного диалогового окна, и, если да, обрабатывает сообщение.
...
когда
IsDialogMessage
обрабатывает сообщение, проверяет сообщения клавиатуры и преобразует их в выборки для соответствующего диалогового окна. Например, клавиша TAB при нажатии выбирает следующий элемент управления или группу элементов управления, а клавиша СТРЕЛКА ВНИЗ при нажатии выбирает следующий элемент управления в группе.Поскольку
IsDialogMessage
выполняет все необходимые операции по переводу и отправке сообщений, сообщение обрабатываетсяIsDialogMessage
не должен передаватьсяTranslateMessage
илиDispatchMessage
функция.
Per Использование диалоговых окон: Создание Box Немодальные Диалог:
Вторая часть примера - это основной цикл сообщений приложения. Цикл включает функцию IsDialogMessage, чтобы гарантировать, что пользователь может использовать интерфейс клавиатуры диалогового окна в этом немодальном диалоговом окне.
Об этом также говорится в CreateDialog()
документация:
После
CreateDialog
возвращается, приложение отображает диалоговое окно (если оно еще не отображается) с помощьюShowWindow
функция. Приложение уничтожает диалоговое окно, используяDestroyWindow
функция. Для поддержки навигации с помощью клавиатуры и других функций диалогового окна цикл сообщений для диалогового окна должен вызыватьIsDialogMessage
функция.
Итак, вместо этого измените цикл сообщений, чтобы он выглядел так:
while (GetMessage(&Meldung, NULL, 0, 0)) {
if (!IsWindow(dialog) || !IsDialogMessage(dialog, &Meldung)) {
TranslateMessage(&Meldung);
DispatchMessage(&Meldung);
}
}