WM_DESTROY & WM_NCDESTROY

来源:互联网 发布:jsp中引入js文件 编辑:程序博客网 时间:2024/06/06 09:50

 

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