当用户单击我的C ++ Win32应用程序中的按钮或菜单项时,我必须打开一个对话框IDD_WINDOW_INFO
。我用来打开对话框的方法如下:
DialogBox(hInstance, MAKEINTRESOURCE(IDD_WINDOW_INFO), hMainWindow, WindowInfoProc);
但我的问题是,当该对话框打开时,用户无法使用我的应用程序的主窗口进行操作。那么我该如何让两个窗口都活动?
答案 0 :(得分:5)
您正在调用DialogBox
,以模态方式显示对话框。显示模态对话框时,其他所有窗口将被禁用,只有模态对话框可以接受输入。这是模态对话的本质和意图。我们的想法是,您只能与对话框进行交互,并且无法与其他窗口进行交互。
另一个答案建议将NULL
作为hWndParent
参数传递给DialogBox
。那不是解决方案。这将导致你拥有一个无主的窗口。是的,您将能够与主窗口进行交互,但是当您这样做时,您的主窗口将显示在对话框的顶部。那是因为所有权设置不正确。我建议您阅读window ownership to better understand the issue。
解决问题的正确方法是显示无模式对话框。无模式对话框允许您与应用程序中的其他窗口进行交互。而这正是你在问题中所要求的。
您可以通过调用CreateDialog
后跟ShowWindow
来显示无模式对话框。此MSDN文章显示了一个示例:Using Dialog Boxes。
答案 1 :(得分:2)
如果我没记错的话,您可以将NULL而不是句柄传递给父窗口,或者在资源编辑器中更改对话框类型。
这是一种简单的方法,但以下情况肯定更好 - 因为拥有无主对话不是您的最佳选择。 关键是DialogBox()将创建一个模态对话框窗口,而CreateDialog则不会。模态对话框禁用父窗口。 从MSDN:无模式对话框既不会禁用所有者窗口也不会向其发送消息。 这应该可以解决你的问题。
CreateDialog(hInstance, MAKEINTRESOURCE(IDD_WINDOW_INFO), hMainWindow, WindowInfoProc);
ShowWindow(hWnd, SW_SHOW);