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 模态对话框的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章