У меня странная проблема. Рассмотрим следующий сценарий:
Псевдокод того, как все происходит: (пожалуйста, игнорируйте синтаксическую корректность здесь)
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
}
Мой вопрос двоякий:
Я думал, что одной из основных причин использования модального диалога была его способность предотвращать переход фокуса на родительские диалоги. Тем не менее, когда отображается это окно с сообщением об ошибке, я могу с радостью щелкнуть диалоговое окно, а затем нажать «Отмена» и сделать вид, что окно с сообщением об ошибке никогда не показывалось.
Вместо того, чтобы ваш рабочий поток вызывал модальное окно сообщения, он должен сообщить об ошибке обратно потоку пользовательского интерфейса. Мой опыт работы с MFC и многопоточностью заключается в том, что обработка всего пользовательского интерфейса в одном потоке значительно упрощает работу и устраняет ошибки такого типа. Наличие двух потоков, одновременно вызывающих модальные диалоги, вызывает проблемы.
Я новичок в этом, но мои предложения будут, если ребенок будет отменен, когда возникнет ошибка, а затем уничтожьте его, прежде чем запускать ошибку.
Насколько я могу судить, SomeDialogClass является модальным, тогда родитель запускает другой модальный диалог, MessageBox. Теперь, если SomeDialogClass был немодальным, тогда окно сообщения появилось бы сверху, поскольку SomeDialogClass был бы потомком всего рабочего стола, а единственным потомком MainWindowClass был бы MessageBox.
У меня сложилось впечатление, что модальное препятствует переходу фокуса к вещам, находящимся под модальным диалогом, а не к тому, что запускается сверху или после его открытия. Я сделал модальное диалоговое окно, запустил немодальный режим и мог отлично перемещаться по экрану. Кроме того, я создал WM_MESSAGE из немодального диалога обратно в модальное, чтобы объявить, когда это будет сделано, чтобы немодальное могло закончиться.