MFC 对话框后未显示 MessageBox

Posted

技术标签:

【中文标题】MFC 对话框后未显示 MessageBox【英文标题】:MessageBox not shown after MFC dialog 【发布时间】:2014-04-03 06:06:19 【问题描述】:

我有一个带有 MFC 对话框的简单 MFC 应用程序:

BOOL CPreparationApp::InitInstance()




    MyDlg Dlg;
    MessageBox(0, L"Text1", L"MessageBox caption", MB_OK);
    m_pMainWnd = &Dlg;
    Dlg.DoModal();
    CString strLine=Dlg.m_editText;

    MessageBox(0, L"Text2", L"MessageBox caption", MB_OK);

        return TRUE;

显示带有Text1的消息框,但是在模态对话框中按OK后没有显示带有Text2的消息框?为什么?

【问题讨论】:

评论 Dlg 代码,看看是否出现了两个消息框(它们会出现),然后尝试使用无模式对话框,因为我认为它的模式超过了第二个消息框 尝试注释掉作业m_pMainWnd = &Dlg 应该打开带有 text1 MyDlg 的消息框。你要关闭它吗?用 text2 关闭该消息框后应该打开。 另一个提示:对于基于对话框的应用,InitInstance 必须返回 FALSE,而不是 TRUE。 注释后 m_pMainWnd = &Dlg 显示第二个消息框。但是为什么对话框会影响 MessageBox 呢?如果我在第二个 MessagesBox 上调试此应用程序断点正常运行。 【参考方案1】:
Dlg.DoModal();

这里称为模态窗口。在你关闭 Dlg 之前它不会返回。然后TEXT2的MessageBox就会出现。

否则,如果 Dlg 派生自 CDialog

,您可以编写如下代码以将 Dlg 创建为 非模态窗口
MyDlg *pDlg = new MyDlg;
pDlg->Create(IDD_MYDLG_DLG, NULL);
pDlg->ShowWindow(SW_SHOW);

哦,我没有在 CWinApp 中看到它。这是因为在你调用 DoModal 到 CWinApp::m_pMainWnd 引用的东西之后,WM_QUIT 消息将被添加到消息队列中。然后创建的每个窗口都将被退出。这是关于 MFC 如何摧毁 CWnd 的。如果您想了解更多,请阅读以下函数的 MFC 源代码。

int CWnd::RunModalLoop(DWORD dwFlags)
void CWnd::OnNcDestroy()
void CDialog::EndDialog(int nResult)

但如果您只想显示第二个框,只需删除它:

m_pMainWnd = &Dlg;

【讨论】:

但按下 OK 后模态窗口已关闭,我期待第二个 MessageBox。【参考方案2】:

通过将m_pMainWnd 设置为您的对话框,您是在告诉MFC 程序应该在对话框关闭时结束。不要那样做。

【讨论】:

以上是关于MFC 对话框后未显示 MessageBox的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中单击 Facebook 登录按钮后未显示 Facebook 身份验证对话框

弹出模式对话框后未选中单选按钮?

急急急!mfc中怎么在基于对话框的主界面中显示proppage属性页?最好有例子

MFC:击键后对话框不显示

添加 syslink 不显示 mfc 对话框

使用 mfc 对话框显示 .bmp 图像时出错