基于对话框的MFC程序,发现每次程序退出时,托盘的小图标不能自动消失,鼠标移上去之后才能消失,比较不爽。
后来发现我删除这个图标的代码是在自己重写的OnClose()函数中,结果断点一看,OnClose()根本没有被调用,确切的说是点“退出”不调用,点右上角的“叉”才调用,难怪出现这个结果,后来还有我想在OnClose()函数中有其他操作也没有被调用。
在http://www.qqgb.com/Program/VC/VCJC/Program_250726.html上看到了一个很好的回帖:
1. 点“确定”、“取消”时的关闭路由为
OnOK()或OnCancel() ---> EndDialog() ---> DestroyWindow() ---> OnDestroy() ---> PostNcDestroy()
2. 点“关闭”标题栏按钮的关闭路由为
OnClose()---> DestroyWindow() ---> OnDestroy() ---> PostNcDestroy()
所以OnClose()并不是关闭路由的必经路径, OnDestroy() 才是程序关闭的必经路径,因此重写OnDestroy() ,把我需要在程序结束的操作全部放到了这个函数里面,OK了,不过还要记得把ON_WM_DESTROY()加到MESSAGE MAP里面。
3.怎么使用OnDestroy()函数
用类向导在消息WM_Destroy里面添加OnDestroy()函数。
OnClose和OnDestroy:
OnClose():消息响应函数,响应WM_CLOSE消息,当"关闭"按钮被单击的时候(而不是我们眼睛所见的对话框从屏幕上消失时),该函数被调用。
OnDestroy():消息响应函数,响应WM_DESTROY消息,当一个窗口即将被销毁时,被发送。
在单视图程序中,程序退出时执行的操作顺序为:
(1)用户点击退出按钮,发送了WM_CLOSE消息;
(2)在WM_CLOSE消息的处理函数中,调用DestroyWindow();
(3)在DestroyWindow()中发送了WM_DESTROY消息;
(4)在WM_DESTROY消息中调用PostQuitMessage(),发送WM_QUIT消息,结束消息循环。
综上,程序先调用OnClose()(也可能不调用),然后调用OnDestroy()(必调用),所以,如果要进行程序结束时的清理工作,应该在OnDestroy()中,而不是在OnClose(),否则就有可能会出现内存泄漏的危险了!