MFC模态对话框关闭错误

MFC模态对话框关闭错误,mfc,modal-dialog,Mfc,Modal Dialog,我有一个奇怪的错误,花了几个小时在调试器中找不到解决方案。 (但它帮助我修复了另一个错误,即永远不要从WM_KICKIDLE任务调用EndDialog) 我的问题是,我有一个主窗口和一个非模态对话框窗口,它会引发一个模态子对话框窗口。当子对话框窗口关闭时。无模式对话框窗口将自身转换为模式窗口。我的代码确实离开了模态循环。如果我关闭“现在模式”窗口,它的行为就像一个“不可见模式”窗口处于活动状态,这意味着不可能再进行交互 当我只在主窗口顶部运行一个模式对话框时,它会很好地关闭 顺便说一句:主窗口不

我有一个奇怪的错误,花了几个小时在调试器中找不到解决方案。 (但它帮助我修复了另一个错误,即永远不要从WM_KICKIDLE任务调用EndDialog)

我的问题是,我有一个主窗口和一个非模态对话框窗口,它会引发一个模态子对话框窗口。当子对话框窗口关闭时。无模式对话框窗口将自身转换为模式窗口。我的代码确实离开了模态循环。如果我关闭“现在模式”窗口,它的行为就像一个“不可见模式”窗口处于活动状态,这意味着不可能再进行交互

当我只在主窗口顶部运行一个模式对话框时,它会很好地关闭

顺便说一句:主窗口不是一个可用的视图CWinApp::m_pMainWnd,而是一个新的创建框架窗口。我隐藏了p_MainWnd,并将其用作一个不可见的仅显示消息的窗口。从一些评论和我的调试会话中,我发现pMainWnd有一些特殊的含义,但我可以弄清楚它与模态窗口到底有什么关系(例如,有一个未记录的“CWinApp::DoEnableModeless”)


编辑:我在对话框附近发布一个WM_,然后使用OnClose()处理程序中的EndDialog(0)退出模式状态。我还尝试直接使用EndDialog(0)。这两种方法没有区别。

当MFC创建一个模态对话框时,它通过禁用上面的窗口使其成为模态对话框。当对话框正常结束并调用EndDialog时,会出现重新启用这些窗口的代码。如果有任何东西阻止代码运行,其他窗口将被锁定


无模式对话框是另一种野兽,EndDialog文档中有一个特别的注释警告您使用DestroyWindow。

也许这是合理的,但我有一个问题:

为什么要使用隐藏窗口?它是作为仅消息窗口创建的(将HWND_消息作为父句柄传递,将消息作为类传递),还是只将其称为仅消息窗口

好的,关于MFC和对话框的更多信息

MFC不使用Windows模式对话框。它总是创建无模式对话框;Create或DoModal调用依次::CreateDlgIndirect windows API

非模态dialof依赖于主窗口消息分派,而模态调用RunModalLoop,类似于MFC窗口消息pupmp(不是消息循环)。 它在执行的主线程中运行而不冻结,因为它允许空闲处理(调用OnIdle)

如何消除无模式对话框?正如马克所指出的,你应该使用DestroyWindow

至于m_pMainWnd,MFC框架广泛地使用它来确定控制主窗口行为的可能因素。通过改变它,你可能已经创造了你所经历的行为

是否将该值设置为新创建的框架,并将其视为主窗口

它是什么类型的MFC应用程序?SDI还是MDI? 是否可以创建测试应用程序来复制此行为并将其发布到某个地方以供下载

顺便说一句,您不必担心DoEnableModeless,因为它除了调用大量使用的hook(COleFrameHook类型)之外什么都不做,除非您试图使用OLE或ActiveX实现某些功能,或者尝试将MFC和.NET Windows窗体结合起来。
总之,如果您的(或者第三方代码使用此钩子,我建议您检查COleFrameHook类中的代码。

您知道MFC如何管理此禁用吗?我还没有找到MFC内部对此的任何解释。@Lothar MFC的一个优点是您可以自己查看源代码。当我的pp被对话框抛出的异常禁用。是否有任何原因不从
OnClose
处理程序调用基类实现,即
\uu super::OnClose()
MyBase::OnClose()
?该应用程序是一个带有多个框架窗口的SDI。主框架窗口与所有的模板一样,但都是隐藏的。原因是它是跨平台可移植库的一部分,为了使控制流与GTK和Cocoa兼容,我不得不隐藏主窗口。因为正如你所说,主窗口和MFC都是隐藏的有很多东西会产生不可移植的控制流。但是所有其他的代码都很像MFC。你有可能创建一个复制这个问题的测试应用程序并发布下载吗?