MFC 模态对话框的奇怪行为

Posted

技术标签:

【中文标题】MFC 模态对话框的奇怪行为【英文标题】:Weird behaviour with MFC Modal Dialogs 【发布时间】:2011-11-18 17:57:54 【问题描述】:

我刚刚注意到我程序中的所有模态对话框都有一个奇怪的行为,

代码将停止 dlg.DoModal() 调用,但其下方的窗口仍将处于活动状态并接受输入。 这发生在我所有的 CDialog 派生窗口(实际上是 CBCGPDialog)和系统消息框、文件对话框等。

我得到的唯一结论是必须有一些消息泵来处理窗口消息,即使它不应该。

这是否发生在其他人身上?以及如何解决它的任何想法?

通过接受输入我的意思是他们仍然响应。

例如,如果我有一个添加按钮,在显示对话框后打开一个模态对话框,我仍然可以单击同一个按钮来显示另一个。

编辑。

我发现了错误。

在 LoadFrame 上传递的位掩码中有一些错误(对于大型机)。

我不知道女巫位,但其中之一会禁用某些机制以使对话框窗口工作

【问题讨论】:

存在消息泵,否则您的对话框无法处理消息。它只会像往常一样调度,因此您的所有者窗口过程仍然会被调用。这是标准行为。所有者窗口应该被禁用,所以“接受”输入听起来很奇怪。你能澄清你的意思吗?所有者窗口是调用 dlg.DoModal() 的窗口吗?创建对话框时是否正确设置了所有者窗口? 我没有指定任何所有者窗口,但是调用对话框的是 MainWindow。顺便说一句,它是一个 MDI 应用程序。 与其编辑您的问题以说您发现了错误,不如发布您自己问题的答案。我有兴趣查看解决方案。 也很想听听你的结果。我遇到了类似的问题,但反过来。关闭模态将模态状态移至父级。 【参考方案1】:

CDialog::DoModal 做了几件事。首先它禁用对话框的父窗口,使其不再响应事件,然后它对通过AfxGetMainWnd() 获得的主窗口执行相同的操作。它使用RunModalLoop() 运行自己的消息泵。

【讨论】:

以上是关于MFC 模态对话框的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个模态的对话框

为啥 MFC 中的模态对话框实际上是内部无模态的?

MFC 创建模态与非模态对话框

MFC——对话框,模态对话框

MFC 模态对话框与非模态对话框

VS2010/MFC编程(对话框:模态对话框及其弹出过程)