gpt4 book ai didi

c++ - 显示模态对话框时禁用所有顶级窗口(WS_POPUP)

转载 作者:行者123 更新时间:2023-11-28 02:01:03 26 4
gpt4 key购买 nike

我有主窗口,然后用户可以在应用程序中“弹出”其中一个框架,使其 float 而不是包含在主窗口中。可以弹出多个框架,因此在给定时间内可能有三个 WS_POPUP 窗口。

问题是当我想显示模态对话框时,我只能使用 DoModal 函数中的参数禁用其中一个。如何使用 DoModal 禁用所有顶级窗口?我不能在显示模态之前简单地禁用窗口然后再启用它,因为可能有多个链接的模态对话框(一个模态对话框打开另一个模态对话框)。

API 是否提供了执行此类操作的方法?我已经用谷歌搜索了两个小时,但找不到足够好的解决方案。我正在使用 MFC、WTL 和 ATL 的组合。

提前致谢!

最佳答案

据我了解,这与 MFC 框架窗口的工作方式相同。

事实上只有 MFC 应用程序的 CFrameWnd 被禁用。在 WM_ENABLE 消息(带有 FALSE)到达时调用 BeginModalState,此函数只是禁用它 float CFrameWnd 的“子窗口”。

同样,当为 CFrameWnd 调用 EnableWindow(WM_ENABLE 到达 TRUE)时。调用 EndModalState 并再次启用所有禁用的“子窗口和 float ”窗口。

查看源码中CFrameWnd::OnEnable、BeginModalState、EndModalSTate的MFC实现

所以你的主窗口知道它自己的弹出窗口。启动真正的模态对话框并禁用此父项后,它将禁用它的 float 弹出窗口。

诀窍是 CDialog::DoModal 需要真正的父级...如果在构造函数中没有给出它在大多数情况下会猜测正确的父级。对于你的情况,你应该有必要提供你的“主窗口”作为父窗口......消息框也是如此......

关于c++ - 显示模态对话框时禁用所有顶级窗口(WS_POPUP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39520461/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com