为了防止用户在出现MessageBox时在我的main_window中单击,我使用了:
EnableWindow(main_window,FALSE);
我得到了一个示例MessageBox:
EnableWindow(main_window,FALSE);
MessageBox(NULL,"some text here","About me",MB_ICONASTERISK);
EnableWindow(main_window,TRUE);
问题是,当我在MessageBox上按"OK"时,它会关闭,并且我的main_window被发送到所有其他系统窗口的后面。为什么会发生这种情况?我试着放:
SetFocus(main_window);
SetActiveWindow(main_window);
之后和之前:EnableWindow(main_window,TRUE)结果很奇怪:它50/50工作。我想我做了不该做的事。
Btw。有没有比更好的解决方案来阻止鼠标点击特定窗口
EnableWindow(main_window,FALSE);
显示模态UI需要启用模态子项并禁用所有者。当模态子项完成时,程序必须颠倒。您发布的代码看起来是实现这一点的直接方法。
但事实并非如此。
问题出现在对MessageBox
和EnableWindow
的调用之间,这些代码不是您编写的。MessageBox
在模态子级(消息框)被销毁后返回。由于这是一个具有前台激活功能的窗口,因此窗口管理器会尝试找到一个要激活的新窗口。没有拥有的窗口,所以它从Z顺序的顶部开始搜索。它找到的第一个窗口是您的,但它仍然被禁用。因此,窗口管理器跳过它,寻找另一个未禁用的窗口。当执行对EnableWindow
的调用时,已经太晚了——窗口管理器已经得出结论,应该激活另一个窗口。
正确的顺序是在销毁模式UI之前启用所有者。
然而,只有当你有理由自己实现模态时,这才是必要的。该系统提供了模式UI的标准实现。为了使用它,将句柄传递给拥有MessageBox
或CreateDialog
(*)等调用的窗口,窗口管理器将为您完成所有繁重的工作。
(*):不幸的是,CreateDialog
的形式参数被误称为hWndParent
父子和所有者拥有的关系非常不同(请参阅关于Windows)。