【发布时间】:2013-03-08 10:49:05
【问题描述】:
我有一个奇怪的问题。考虑以下场景:
- 主窗口在单击某个按钮时创建一个子对话框。
- 子对话框在工作线程中执行某些任务。
- 该任务期间发生错误,导致显示一个消息框,内容类似于“哎呀!出了问题。”。
- 单击子对话框的“取消”按钮导致子对话框关闭。
- 消息框仍处于活动状态!点击消息框中的任何内容 = 崩溃。
事情发生的伪代码:(请忽略此处的语法正确性)
MainWindowClass mainObj;
void MainWindowClass::OnSomeButtonClick()
{
SomeDialogClass someDialogObj;
someDialogObj.DoModal();
}
int MainWindowClass::doTask()
{
// Do work
if(ERROR)
{
MessageBox("Yikes! Something went wrong.", "Error", MB_OK);
return ERROR;
}
}
///////////////////////////////////////////////////////////////////
// Meanwhile, in another file,
extern MainWindowClass mainObj;
void SomeDialogClass::OnCancel()
{
// Do all cleanup and close dialog
}
int SomeDialogClass::workerThreadFunc()
{
return mainObj.doTask();
}
int SomeDialogClass::DoModal()
{
AfxBeginThread(workerThreadFunc);
// Do all other work and then wait for the worker thread
}
我的问题有两个:
- 取消时,有没有办法知道是否有任何消息框/对话框 同一个应用程序处于活动状态?
- 我的整个设计都错了吗?我应该完全做其他事情吗?
我认为使用模态对话框的主要原因之一是它能够防止焦点转到父对话框。然而,当显示该错误消息框时,我可以愉快地单击对话框,然后单击“取消”并假装错误消息框从未显示。
【问题讨论】:
-
我怀疑在 Cancel 上没有正确清理东西,因此你会崩溃。
-
@TonyTheLion,如果我在点击“取消”之前消除错误,则不会发生崩溃。发生崩溃是因为消息框的
IsWindow()断言失败。 -
那么你的问题是什么?
-
"取消时,有没有办法知道同一应用程序中的任何消息框/对话框是否处于活动状态?"
-
@TonyTheLion,我很抱歉拒绝了你的建议。我做了一些愚蠢的假设。我应该将我的结果作为答案/问题/评论发布吗?感谢您的评论顺便说一句
标签: c++ windows mfc messagebox