簡體   English   中英

如何在無模式對話框中使用 Enter 鍵?

[英]How to use the Enter key in a modeless dialog?

我一直在為大學研究 WinAPI 項目,我們被要求在對話框中實施完整的程序。 起初,我使用了一個模態對話框,一切正常,除了對話框的任務欄中沒有圖標,因為我直接在 WM_CREATE 上創建了它,並且沒有使主 window 可見,因為它不是用過的。

現在我完全放棄了主要的 window 句柄,只使用CreateDialog創建一個無模式對話框,但從那以后我不能使用Enter鍵作為默認按鈕的替代品。

case WM_COMMAND:
    if(LOWORD(wparam) == IDOK || LOWORD(wparam) == IDC_OK) {
        [...] //doing stuff
    }
    break;

這是我完整的主要 function:

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 通知聲音。

您的消息循環需要包含對IsDialogMessage()的調用:

確定消息是否用於指定的對話框,如果是,則處理該消息。

...

IsDialogMessage處理消息時,它會檢查鍵盤消息並將它們轉換為相應對話框的選擇。 例如,TAB 鍵在按下時選擇下一個控件或控件組,向下箭頭鍵在按下時選擇組中的下一個控件。

因為IsDialogMessage function 執行所有必要的消息翻譯和分派,所以不能將IsDialogMessage處理的消息傳遞給TranslateMessageDispatchMessage function。

使用對話框:創建無模式對話框

示例的第二部分是應用程序的主消息循環。 該循環包括 IsDialogMessage function 以確保用戶可以在此無模式對話框中使用對話框鍵盤界面。

CreateDialog()文檔中也說明了這一點:

CreateDialog返回后,應用程序使用ShowWindow function 顯示對話框(如果尚未顯示)。 應用程序使用DestroyWindow function 銷毀對話框。 要支持鍵盤導航和其他對話框功能,對話框的消息循環必須調用IsDialogMessage function。

因此,將您的消息循環更改為更像這樣:

while (GetMessage(&Meldung, NULL, 0, 0)) {
    if (!IsWindow(dialog) || !IsDialogMessage(dialog, &Meldung)) {
        TranslateMessage(&Meldung);
        DispatchMessage(&Meldung);
    } 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM