【问题标题】:MessageBox returning instantly after a MFC DoModal() callMessageBox 在 MFC DoModal() 调用后立即返回
【发布时间】:2012-01-28 20:29:30
【问题描述】:

主题说明了一切:如果在 CDialog::DoModal() 之后调用 MessageBox,则会立即返回(不显示任何内容)。我尝试过各种 MessageBox:MessageBoxA、MessageBoxW、CWnd::MessageBox(通过使用对话框)、AfxMessageBox。没有工作,他们立即返回 1。我尝试保存对话框的 HWND 并将其用作第一个参数。我尝试将 GetDesktopWindow() 作为 HWND 参数传递。我尝试了诸如 MB_YESNO|MB_ICONSTOP 之类的东西。没有任何效果。

我怀疑我遗漏了一些非常明显的东西,但对于我的生活,我无法弄清楚是什么,我一直在寻找一个超过 2 小时的解决方案。我尝试使用 MFC 向导创建一个新项目,选择对话框模板并在 DoModal() 调用之后添加对 MessageBoxA 的调用:

CdelmeDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
MessageBoxA(0, "test", "test", 0);

对话框显示得很好,但是当我单击确定或取消时,消息框根本不显示。

如果我将 MessageBoxA() 调用置于 DoModal() 调用之上,它会完美运行。

编辑:有没有办法防止这种行为?

【问题讨论】:

  • 以下内容在您的上下文中有效吗? MessageBoxA(0, "test", "test", MB_TASKMODAL);
  • 我已经尝试过了,但没有成功。事实证明,问题是在关闭对话框窗口时线程被 MFC 终止,就像 Daniel Mošmondor 发布的那样。删除将 dlg 分配给 m_pMainWnd 的行解决了我的问题。

标签: mfc modal-dialog messagebox


【解决方案1】:

凭记忆:

MFC 框架的设计方式是,如果主窗口(在您的情况下为 dlg)退出,则消息循环结束,您将无法再进行任何 GUI 操作。

更多信息(来自创作者):

Microsoft 基础类库将自动终止 当 m_pMainWnd 引用的窗口关闭时你的线程。

来自:

http://msdn.microsoft.com/en-us/library/f3ddxzww(v=vs.80).aspx

【讨论】:

  • 非常感谢。用问题编辑了我的原始帖子。解决方案是删除分配给 m_pMainWnd 的行。
  • 是的,确实如此,我通过将 m_pMainWnd 保留为 NULL 来使其正常工作。再次感谢。
猜你喜欢
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多