关闭窗口的流程


原文链接:http://hi.baidu.com/wobash/item/5561429275f56749f0421520


退出消息循环


我们知道windows程序的一个界面线程有一个消息队列,线程创建窗口以后,就无限循环消息队列,消息队列里面的消息被一个一个取出来发送到相应的窗口过程。当从消息队列得到的消息是WM_QUIT ,线程就不再读取消息,就退出,结束线程。所以要退出线程,只要给线程发送,也就是给消息队列发送WM_QUIT即可。一般来说,PostQuitMessage()函数就给消息队列发送WM_QUIT。 

按照上面的说明,消息队列里面的WM_QUIT以后的消息,也就是在WM_QUIT发送以后的消息均得不到处理。 
还有就是我们可以直接向消息队列里面发送WM_QUIT消息,通过使用PostMessage,只要能保证消息能进入消息队列。按照道理来说,PostMessage发送的消息是要经过消息队列的,但是有的时候,他也是直接调用窗口过程的,(sendMessage是直接调用目标窗口的窗口过程,不经过消息队列。)所以一般不用PostMessage来发送WM_QUIT消息,为什么呢?不是说了么,有的时候他是不投入到消息队列的,那么线程就从消息队列里面得不到WM_QUIT,就退出不了线程。 
什么时候呢?比如说:模式对话框的时候,给主窗口用PostMessage发送消息的话,这个时候就是直接调用主窗口的窗口过程。


关闭窗口的流程


我们知道窗口的默认窗口过程是DefWindowProc,这个是windows提供的。在我们自己的窗口过程中,我们不需要关心的消息最后都统统传递给DefWindowProc。 
当我们点标题栏的关闭按钮,或者系统菜单的关闭菜单的时候,DefWindowProc得到输入事件信息,给对应的窗口发送WM_SYSCOMMAND 消息,也就是窗口过程再一次会得到WM_SYSCOMMAND消息,这个消息我们不作处理,直接传递给DefWindowProc的话,那么DefWindowProc在处理WM_SYSCOMMAND消息的时候,再一次发送WM_CLOSE 消息给窗口过程,这个消息我们也不作处理,直接传递给DefWindowProc。那么,DefWindowProc得到WM_CLOSE后,调用DestroyWindow() 进行窗口摧毁,DestroyWindow进行一些必要的处理之后,又发送WM_DESTROY和WM_NCDESTROY 被发送给窗口过程。这消息处理完后,窗口完全被 
摧毁。 
这样,在窗口被摧毁之前,我们有至少4此机会被通知,WM_SYSCOMMAND,WM_CLOSE,WM_DESTROY,WM_NCDESTROY。 
反过来说,我们要关闭一个窗口时候,可以发送WM_SYSCOMMAND,WM_CLOSE消息。为什么不通过发送WM_DESTROY,WM_NCDESTROY呢。看看上面的处理过程,如果通过发送WM_DESTROY,WM_NCDESTROY,那么DestroyWindow函数的处理怎么办呢?对了,直接调用DestroyWindow不就是了。 
在进一步,如果窗口关闭后,我们想退出线程怎么办?好办,WM_DESTROY的时候,PostQuitMessage发送WM_QUIT就OK了。想想,为什么不在WM_CLOSE的时候发送WM_QUIT。

WM_QUIT, WM_CLOSE, WM_DESTROY的一些区别

WM_CLOSE:

  在系统菜单里选择了“关闭”或者点击了窗口右上角的“X”按钮,你的窗口过程就会收到WM_CLOSE。DefWindowProc对 WM_CLOSE的处理是调用DestroyWindow。当然,你可以不让DefWindowProc处理,而是自己处理,例如询问用户是否保存更改等。如果用户选择“取消”,你忽略此消息,那么程序照常运行;如果用户确认要退出,你就调用DestroyWindow。


WM_DESTROY:

  接下来,DestroyWindow完成窗口的清理工作,最后像窗口过程发送WM_DESTROY。对于 WM_DESTROY,DefWindowProc不会处理。也就是说,你如果不处理这个消息,虽然你的窗口已经销毁,但进程并不会结束。一般处理 WM_DESTROY时都是释放资源(例如申请的内存等),然后调用PostQuitMessage。

WM_QUIT:

  PostQuitMessage会发送WM_QUIT给消息队列。注意,WM_QUIT永远不会到达窗口过程,因为GetMessage得到WM_QUIT后就会返回FALSE,从而结束消息循环,最后进程结束,程序退出。


当使用者按下系统功能表中的Close按钮,系统送出WM_Close,通常程序的窗口函数不拦截此消息,于是DefWindowProc处理它,DefWindowProc收到WM_Close后调用DestoryWindow把窗口清除,DestroyWindow本身会送出 WM_Destory.程序对WM_Destory的标准反应是调用PostQuitMessage,PostQuitMessage送出 WM_Quit,结束消息循环


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值