Как использовать клавишу 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);
    } 
}
Другие вопросы по тегам