如何解决如何在无模式对话框中使用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,0)) {
TranslateMessage(&Meldung);
DispatchMessage(&Meldung);
}
return Meldung.wParam;
}
我只是在做一些基本的事情上做错了吗?或者它不是按照我想要的方式工作的吗?
要澄清一下:如果我在对话框中按 Enter 键,则只会听到典型的Windows通知声音。
解决方法
您的消息循环需要包含对IsDialogMessage()
的调用:
确定消息是否用于指定的对话框,如果是,则处理该消息。
...
IsDialogMessage
处理一条消息时,它检查键盘消息并将其转换为相应对话框的选择。例如,按下TAB键时,选择下一个控件或一组控件,然后按向下箭头键可以选择组中的下一个控件。由于
IsDialogMessage
函数执行所有必要的消息翻译和分派,因此不能将IsDialogMessage
处理的消息传递给TranslateMessage
或DispatchMessage
函数。
每Using Dialog Boxes: Creating a Modeless Dialog Box:
该示例的第二部分是应用程序的主消息循环。 该循环包含IsDialogMessage函数,以确保用户可以在此无模式对话框中使用对话框键盘界面。
CreateDialog()
文档中也对此进行了说明:
返回
CreateDialog
之后,应用程序将使用ShowWindow
函数显示对话框(如果尚未显示)。应用程序使用DestroyWindow
函数破坏对话框。 要支持键盘导航和其他对话框功能,对话框的消息循环必须调用IsDialogMessage
函数。
因此,将您的消息循环更改为更像这样:
while (GetMessage(&Meldung,NULL,0)) {
if (!IsWindow(dialog) || !IsDialogMessage(dialog,&Meldung)) {
TranslateMessage(&Meldung);
DispatchMessage(&Meldung);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。