我在 WTL 中有一个 GUI 窗口,它在 CMessageLoop 实例内的线程内运行,该实例已添加到应用程序实例并运行。现在,在主 GUI 内的按钮处理程序中,我创建了一个新窗口。一旦我单击该按钮并创建窗口并尝试将退出消息发布到主 GUI 循环。编码:
主窗口,有自己的线程:
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 被破坏并且子对话框被破坏。这里发生了什么?