OnClose()消息和 OnDestroy()消息 释放动作时用到

本文解析了MFC程序中的关闭流程,详细说明了OnClose()与OnDestroy()的区别及应用,并提供了如何正确处理程序关闭时资源释放的方法。

基于对话框的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(),否则就有可能会出现内存泄漏的危险了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值