Duilib使用Close()关闭窗口

窗口被关闭流程:
按钮发送WM_CLOSE消息给窗口,窗口处理(窗口关闭前消息事件)但不截断信息,继续传递给::DefWindowProc 系统消息处理,系统调用DestroyWindow销毁本窗口,同时发送ON_DESTROY消息给窗口,窗口接受该消息处理(窗口关闭中消息事件),一般需要在窗口处理函数调用PostQuitMessage(),该函数发送WM_QUIT消息,消息循环函数接收到该消息,退出消息循环,退出winmain函数,程序结束。

duilib中, WindowImplBase窗口实现类OnClose()、OnDestory()函数未处理消息,导致关闭窗口调用的Close()函数只能销毁窗口,而进程仍然在后台,因为消息循环还在继续,WM_QUIT消息没被发送。对于有消息循环的窗口(主窗口、模态子窗口(ShowModal显示的窗口)),需要重写OnDestroy()函数,在函数内加入PostQuitMessage()函数,由此函数发送WM_QUIT消息退出消息循环。

其中,WM_CLOSE -->OnClose()、WM_DESTROY -->OnDestroy(),这些消息处理函数在WindowImplBase类中初始实现虚函数。

退出函数Close()由UIBase文件的CWindowWnd类提供,内部就是调用发送WM_CLOSE消息给本窗体:

void CWindowWnd::Close(UINT nRet)
{
ASSERT(::IsWindow(m_hWnd));
if( !::IsWindow(m_hWnd) ) return;
PostMessage(WM_CLOSE, (WPARAM)nRet, 0L);
}

你可能感兴趣的:(Duilib使用Close()关闭窗口)