[英]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
處理的消息傳遞給TranslateMessage
或DispatchMessage
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.