窗口被關閉流程:
按鈕發送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);
}