CMainFrame OnCreate 中的消息框

Posted

技术标签:

【中文标题】CMainFrame OnCreate 中的消息框【英文标题】:Messagebox in CMainFrame OnCreate 【发布时间】:2014-03-24 12:32:14 【问题描述】:

我有一个旧的 MFC 应用程序,其 OnCreate 函数跨越 200 行以上。

CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

...
PostMessage(LOAD_IMAGES,0,0);
...
ValidatePermissions();
...

LOAD_IMAGES 是一条用户消息,其处理程序尝试加载上次会话中未保存的图像。基本上它尝试创建一个新的 CDocument...

ValidatePermissions 函数在发现缺少任何权限时会弹出一个模态消息框..

我注意到如果弹出模式消息框,那么当 LOAD_IMAGES 处理程序触发时我会崩溃(因为它无法创建 CDocument,我认为这是因为 CMainFrame 尚未创建)。

我应该如何处理这种情况。是否有任何文档建议在 OnCreate 中不要有模式消息框?

【问题讨论】:

【参考方案1】:

尝试将对 ValidatePermissions 的调用移至 LOAD_IMAGES 的消息处理程序。在您让消息框泵送消息之前,这应该让窗口创建完成。

【讨论】:

所以基本上我应该移动任何可能导致模式消息框从 PostMessage 调用运行的东西? 一个消息框泵送消息,它引入了重新进入您的 wndproc 的可能性(即,当您仍在另一个消息处理程序中时调用 MFC 消息处理程序。) PostMessage 不是问题的原因:很多消息可能会导致在消息框期间重新进入。 好的,所以基本上如果有消息泵送,就有风险。从 postmessage 调用中调用消息框将允许 OnCreate 消息处理程序在消息框泵启动之前完成。

以上是关于CMainFrame OnCreate 中的消息框的主要内容,如果未能解决你的问题,请参考以下文章

c++单文档如何在点关闭按钮时出现提示框,必须是在窗口关闭前出现

MFC 窗口样式

在MFC应用程序中的CStatusBar中添加CSliderCtrl

MFC小程序

新建一个MFC单文档程序含有菜单和工具栏,又建了一个对话框,如何直接显示对话框?

VS2015 MFC 进度栏编程