0

我一直在为大学做一个 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 通知声音。

4

1 回答 1

0

您的消息循环需要包括对以下内容的调用IsDialogMessage()

确定消息是否用于指定的对话框,如果是,则处理该消息。

...

IsDialogMessage处理消息时,它会检查键盘消息并将它们转换为相应对话框的选择。例如,TAB 键在按下时选择下一个控件或控件组,向下箭头键在按下时选择组中的下一个控件。

因为该函数执行所有必要的消息翻译和分派,所以不能将IsDialogMessage处理的消息传递给or函数。IsDialogMessageTranslateMessageDispatchMessage

使用对话框:创建无模式对话框

示例的第二部分是应用程序的主消息循环。该循环包括 IsDialogMessage 函数,以确保用户可以在此无模式对话框中使用对话框键盘界面。

这也在CreateDialog()文档中说明:

返回后,应用程序使用该函数CreateDialog显示对话框(如果尚未显示) 。应用程序使用该函数ShowWindow销毁对话框。要支持键盘导航和其他对话框功能,对话框的消息循环必须调用该函数。DestroyWindowIsDialogMessage

因此,将您的消息循环更改为更像这样:

while (GetMessage(&Meldung, NULL, 0, 0)) {
    if (!IsWindow(dialog) || !IsDialogMessage(dialog, &Meldung)) {
        TranslateMessage(&Meldung);
        DispatchMessage(&Meldung);
    } 
}
于 2020-08-14T23:26:10.257 回答