私は奇妙な種類の問題を抱えています。次のシナリオを検討してください。
- メインウィンドウは、ボタンをクリックすると子ダイアログを作成します。
- 子ダイアログは、ワーカー スレッドでいくつかのタスクを実行します。
- そのタスク中にエラーが発生し、メッセージ ボックスが表示されて、「イイね! 何かがおかしくなりました.」 のようなメッセージが表示されます。
- 子ダイアログの「キャンセル」ボタンをクリックすると、子ダイアログが閉じられます。
- メッセージボックスはまだアクティブです!メッセージ ボックス内の何かをクリックすると、クラッシュします。
物事がどのように起こっているかの疑似コード: (ここでは構文の正しさを無視してください)
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
}
私の質問は 2 つあります。
- キャンセル時に、同じアプリケーションのメッセージ ボックス/ダイアログがアクティブかどうかを知る方法はありますか?
- 私のデザイン全体が間違っているのでしょうか?
モーダル ダイアログを使用する主な理由の 1 つは、フォーカスが親ダイアログに移動するのを防ぐ機能だと思いました。それでも、そのエラー メッセージ ボックスが表示されたら、喜んでダイアログをクリックし、[キャンセル] をクリックして、エラー メッセージ ボックスが表示されなかったふりをすることができます。