В общем компилируется и запускается все нормально, но в InitInstance написано после dlg.DoModal() показать еще и AfxMessageBox, чего не происходит. Не понимаю почему. Даже догадок не имею. Код полностью:
И похоже, что в очередь сообщений уже попало WM_QUIT, которое при дальнейшей обработке приводит к немедленному закрытию всех свежесозданных окон. По крайней мере, если воткнуть пониже
CHelloDialog dlg2;
dlg2.DoModal();
и сходить дебаггером внутрь, то во внутренностях CWnd::RunModalLoop оно доходит до этих пор и отваливается, сразу показав диалог:
// pump message, but quit on WM_QUIT
if (!AfxPumpMessage())
{
AfxPostQuitMessage(0);
return -1;
}
---
Пока сложно для меня22.10.07 23:37 Автор: Heller <Heller> Статус: Elderman
Я только начал MFC изучать, так что пока плохо соображаю, что к чему, но не понятно какое отношение в данном случае вообще переменная m_pMainWnd имеет к AfxMessageBox (допустим мы поменяем сообщение на простое "Hello World" без обращения к члену диалога). Если вообще не создавать никакого окна и сразу в InitInstance прописать AfxMessageBox то оно нормально сработает с нулевым m_pMainWnd.
> И похоже, что в очередь сообщений уже попало WM_QUIT, > которое при дальнейшей обработке приводит к немедленному > закрытию всех свежесозданных окон. По крайней мере, если > воткнуть пониже Насколько я это понимаю, для CHelloApp такое понятие как очередь сообщений появляется только после того, как InitInstance вернет значение TRUE - до этого момента никто извне никак на его работу повлиять не может. Ну а то что WM_QUIT посылается в диалог опять же непонятно каким образом прерывает выполнение InitInstance.
> и сходить дебаггером внутрь, то во внутренностях Пытался с этим разобраться, но пока совершенно ситуация для меня никак не проясняется.
Просто если главное окно _уже_ было задано, то обработка его...23.10.07 00:12 Автор: dl <Dmitry Leonov>
> Я только начал MFC изучать, так что пока плохо соображаю, > что к чему, но не понятно какое отношение в данном случае > вообще переменная m_pMainWnd имеет к AfxMessageBox > (допустим мы поменяем сообщение на простое "Hello World" > без обращения к члену диалога). Если вообще не создавать > никакого окна и сразу в InitInstance прописать > AfxMessageBox то оно нормально сработает с нулевым > m_pMainWnd.
Просто если главное окноужебыло задано, то обработка его закрытия имеет особый смысл для приложения. И после этого функция GetMessage, которая вызывается при создании всех последующих окон искренне считает, что приложение находится на стадии завершения и возвращает ноль, что приводит к практически мгновенному закрытию всех в дальнейшем создаваемых окон. Кстати, если не инициализировать m_pMainWnd, то есть шанс что все заработает как ожидалось.
> > И похоже, что в очередь сообщений уже попало WM_QUIT, > > которое при дальнейшей обработке приводит к > немедленному > > закрытию всех свежесозданных окон. По крайней мере, > если > > воткнуть пониже > Насколько я это понимаю, для CHelloApp такое понятие как > очередь сообщений появляется только после того, как > InitInstance вернет значение TRUE - до этого момента никто > извне никак на его работу повлиять не может. Ну а то что > WM_QUIT посылается в диалог опять же непонятно каким > образом прерывает выполнение InitInstance.
Не совсем так. В случае приложения с главным окном-диалогом после завершения InitInstance завершается и все приложение, а качестве его очереди сообщений используется диалоговая.
> > и сходить дебаггером внутрь, то во внутренностях > Пытался с этим разобраться, но пока совершенно ситуация для > меня никак не проясняется.
Теперь разобрался, спасибо!23.10.07 03:02 Автор: Heller <Heller> Статус: Elderman