我使用 CreateWindow()
创建了一个窗口,然后用 ShowWindow()
显示它。但是,创建该窗口的父窗口应该在用户返回该窗口之前禁用,即应该模拟模态对话框。
我使用 CreateWindow()
创建了一个窗口,然后用 ShowWindow()
显示它。但是,创建该窗口的父窗口应该在用户返回该窗口之前禁用,即应该模拟模态对话框。
确保在CreateWindow
中设置hwndParent
并使用EnableWindow(hwndParent, FALSE)
来禁用父窗口,以便在显示弹出窗口后禁用它。在弹出窗口关闭后,使用EnableWindow(hwndParent, TRUE)
启用父窗口。
模态性,第1部分:UI模态性与代码模态性解释了如何实现此功能以及为什么您可能不想这样做。
DialogBox()
来创建模态对话框。然而,如果你想使用 CreateWindow()
,那么你需要手动禁用父窗口。好的,我刚才自己也遇到了这个问题。我需要一个快速对话框,它的行为就像我使用DialogBox()时的那样,但我不想为我正在使用的特定项目创建一个模板。
我的发现是,如果禁用对话框的父窗口,则也会禁用对话框。而且你不能重新启用该对话框,而不重新启用父对话框。所以那种方法行不通。
我还发现,你不能使用SetCapture()/ReleaseCapture(),因为这样对话框的子窗口将无法收到消息。
我找到了一种解决方案:使用本地消息泵,由PeekMessage()或GetMessage()驱动。以下是适用于我的代码:
while (!m_bFinished)
{
BOOL bEat;
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_CHAR)
{
if (msg.wParam == VK_ESCAPE)
{
m_bFinished = TRUE;
continue;
}
}
bEat = FALSE;
if (msg.message >= WM_MOUSEFIRST &&
msg.message <= WM_MOUSELAST)
{
RECT rectMe;
pcMe->GetWindowRect(&rectMe);
if (!::PtInRect(&rectMe, msg.pt))
bEat = TRUE;
}
if (!bEat)
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
}
您还可以运行一个“辅助消息循环”,使父窗口保持不活动,直到您完成与“模态”对话框的工作。
EnableWindow(hwndParent, TRUE)
以正确的顺序禁用和启用窗口,请参阅禁用和启用窗口的正确顺序。 - Alexey Ivanov