MessageBox возвращается сразу после вызова MFC DoModal ()

В теме сказано все: у меня проблема, когда MessageBox немедленно возвращается (ничего не отображая), если он вызывается после CDialog :: DoModal (). Я пробовал все виды MessageBox: MessageBoxA, MessageBoxW, CWnd :: MessageBox (используя диалог), AfxMessageBox. Ничего не работает, и они сразу возвращают 1. Я попытался сохранить HWND диалогового окна и использовать его в качестве первого параметра. Я попытался передать GetDesktopWindow () в качестве параметра HWND. Я пробовал такие вещи, как MB_YESNO | MB_ICONSTOP. Ничего не получилось.

Я подозреваю, что мне не хватает чего-то действительно очевидного, но, хоть убей, я не могу понять, что именно, и я уже более 2 часов искал решение. Я попытался создать новый проект с помощью мастера MFC, выбрав шаблон диалогового окна и просто добавив вызов MessageBoxA сразу после вызова DoModal ():

CdelmeDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
MessageBoxA(0, "test", "test", 0);

Диалоговое окно отображается нормально, но когда я нажимаю «ОК» или «Отмена», окно сообщения просто не появляется.

Если я помещаю вызов MessageBoxA () над вызовом DoModal (), он работает отлично.

Изменить: есть ли способ предотвратить такое поведение?


person Birt    schedule 28.12.2011    source источник
comment
работает ли следующее в вашем контексте? MessageBoxA(0, "test", "test", MB_TASKMODAL);   -  person ZagNut    schedule 28.12.2011
comment
Я уже пробовал это безуспешно. Оказывается, проблема заключалась в том, что поток был прерван MFC, когда диалоговое окно было закрыто, как и Даниэль Мошмондор. Удаление строки, которая назначает dlg для m_pMainWnd, устранило мою проблему.   -  person Birt    schedule 28.12.2011


Ответы (1)


Из памяти:

Фреймворк MFC разработан таким образом, что при выходе из главного окна (в вашем случае dlg) циклы сообщений заканчиваются, и больше не будет ничего, что вы могли бы делать с помощью графического интерфейса.

Подробнее (от Создателей):

Библиотека классов Microsoft Foundation автоматически завершит ваш поток при закрытии окна, на которое ссылается m_pMainWnd.

от:

http://msdn.microsoft.com/en-us/library/f3ddxzww(v=vs.80).aspx

person Daniel Mošmondor    schedule 28.12.2011
comment
Большое спасибо. Отредактировал свой исходный пост с вопросом. Решением было удалить строку, которая присваивается m_pMainWnd. - person Birt; 28.12.2011
comment
Да, это так, я заставил его работать, оставив m_pMainWnd NULL. Еще раз спасибо. - person Birt; 28.12.2011