c ++, mfc — отображение окна сообщения, в главном окне есть кнопка отмены. запретить отмену, пока ящик сообщений активен

У меня странная проблема. Рассмотрим следующий сценарий:

  • Главное окно создает дочерний диалог при нажатии какой-либо кнопки.
  • Дочерний диалог выполняет некоторую задачу в рабочем потоке.
  • Во время этой задачи возникает ошибка, приводящая к отображению окна сообщения с текстом «Yikes! Что-то пошло не так».
  • Нажатие кнопки «Отмена» дочернего диалога приводит к закрытию дочернего диалога.
  • Окно сообщения все еще активно! Нажатие на что-либо в окне сообщения = сбой.

Псевдокод того, как все происходит: (пожалуйста, игнорируйте синтаксическую корректность здесь)

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
}

Мой вопрос двоякий:

  1. При отмене, есть ли способ узнать, есть ли какие-либо окна / диалоги сообщений в
    одно и то же приложение активно?
  2. Неужели весь мой дизайн неправильный, и я должен заниматься чем-то другим?

Я думал, что одной из основных причин использования модального диалога была его способность предотвращать переход фокуса на родительские диалоги. Тем не менее, когда отображается это окно с сообщением об ошибке, я могу с радостью щелкнуть диалоговое окно, а затем нажать «Отмена» и сделать вид, что окно с сообщением об ошибке никогда не показывалось.

1

Решение

Вместо того, чтобы ваш рабочий поток вызывал модальное окно сообщения, он должен сообщить об ошибке обратно потоку пользовательского интерфейса. Мой опыт работы с MFC и многопоточностью заключается в том, что обработка всего пользовательского интерфейса в одном потоке значительно упрощает работу и устраняет ошибки такого типа. Наличие двух потоков, одновременно вызывающих модальные диалоги, вызывает проблемы.

5

Другие решения

Я новичок в этом, но мои предложения будут, если ребенок будет отменен, когда возникнет ошибка, а затем уничтожьте его, прежде чем запускать ошибку.

Насколько я могу судить, SomeDialogClass является модальным, тогда родитель запускает другой модальный диалог, MessageBox. Теперь, если SomeDialogClass был немодальным, тогда окно сообщения появилось бы сверху, поскольку SomeDialogClass был бы потомком всего рабочего стола, а единственным потомком MainWindowClass был бы MessageBox.

У меня сложилось впечатление, что модальное препятствует переходу фокуса к вещам, находящимся под модальным диалогом, а не к тому, что запускается сверху или после его открытия. Я сделал модальное диалоговое окно, запустил немодальный режим и мог отлично перемещаться по экрану. Кроме того, я создал WM_MESSAGE из немодального диалога обратно в модальное, чтобы объявить, когда это будет сделано, чтобы немодальное могло закончиться.

0

По вопросам рекламы [email protected]