The WM_NCDESTROY message is sent after the child windows have been destroyed. In contrast, WM_DESTROY is sent before the child windows are destroyed.
通过spy++抓取消息也发现,窗口接受到的最后消息是WM_DESTROY 和 WM_NCDESTROY. 截图我就不上传了.日志中弄个图太麻烦了.
所以在WM_NCDESTROY消息到达后,销毁窗口类是最好的时机了. MFC中CWnd的OnNcDestroy()函数中主要做了以下几件事(OLE Wnd不管): 1. cleanup main and active windows.这些信息主要保存在WinThread中.至于CWinThread后续再研究. 在此过程中,如果是主线程的话,会AfxPostQuitMessage(0);向主线程发送WM_QUIT消息退出主消息循环. 2. cleanup tooltip support. 如果你的窗口支持ToolTip的话,那肯定要delete tool tip 对吧. 3. call default, unsubclass, and detach from the map. 还原回原来的默认处理函数,Dettach Wnd.从HWnd Map中去除. 4. 最好一步,给外部一个可以处理后事的机会.调用虚函数PostNcDestroy().
CWnd在PostNcDestroy()中啥事也没有做.CDialog也并没有重载PostNcDestroy(). 而如果是自己负责自己生命周期的窗口类的话,delete掉自己的最好机会莫过于在PostNcDestroy()中delete掉自己了. 而在PostNcDestroy()中delete掉自己的窗口类就要书CFrameWnd和CView
所以,当在设计重载控件的时候,注意一下你要设计的窗口类是自己管理生命周期的呢? 还是有其他类来管理.
over |