У меня есть окно GUI в WTL, которое запускается внутри потока внутри экземпляра CMessageLoop, который был добавлен в экземпляр приложения и запускается. Теперь внутри обработчика кнопок в основном графическом интерфейсе я создаю новое окно. Как только я нажимаю эту кнопку, создаю окно и пытаюсь опубликовать сообщение о выходе в основной цикл графического интерфейса. Код:
Главное окно имеет собственный поток:
CMessageLoop theLoop;
_MyppModule.AddMessageLoop(&theLoop);
if(m_pMyDlg == NULL) {
m_pMyDlg = new CMyDlg();
if(!IsWindow(*m_pMyDlg))
{
m_pMyDlg->Create(NULL);
m_pMyDlg->ShowWindow(SW_SHOW);
nRet = theLoop.Run();
_MyppModule.RemoveMessageLoop();
}
}
Обработчик кнопки и создание дочернего окна:
LRESULT CMyDlg::OnButtonClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
ChildWindowDlg childDlg;
childDlg.Create(m_hWnd);
childDlg.ShowWindow(SW_SHOW);
CMessageLoop _loop;
);
_loop.Run();
::DestroyWindow(childDlg);
return S_OK;
}
Теперь, если я нажму кнопку «Закрыть» в моем окне MyDlg, будет вызван обработчик кнопки, внутри которого я делаю ::PostQuitMessage
, но это никогда не достигает цикла сообщений theLoop из первого фрагмента кода. Это происходит после выхода из второго цикла, поэтому _loop уничтожается, а дочерний диалог уничтожается. Что здесь происходит?