显示模态对话框

时间:2016-09-15 21:13:35

标签: c++ mfc atl wtl

我有主窗口,然后用户可以弹出"应用程序中的一个框架,以便它浮动而不是包含在主窗口中。可以弹出多个帧,以便在给定时间内可能有三个WS_POPUP窗口。

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

API是否提供了这样的方法?我用Google搜索了两个小时,但找不到足够好的解决方案。我使用MFC,WTL和ATL的组合。

提前致谢!

1 个答案:

答案 0 :(得分:1)

据我所知,问题与MFC框架窗口的工作方式相同。

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

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

在源代码中查看CFrameWnd :: OnEnable,BeginModalState,EndModalSTate的MFC实现。

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

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