MFC 用户界面线程:界面线程的退出 窗口关闭的流程

原文链接:http://wenku.baidu.com/link?url=6CFkWbLOeFgNoUsJniCX3ksw6-RztxMr9Z_e6t7uu3e_vV7UTKThUEkyRkq8IXwxIw5qYctN8gIxcPU6mhSIzaLvkVeaq-xVjWsQAKekkqK


用户界面线程:界面线程的退出 窗口关闭的流程

 
疯狂代码  http://www.CrazyCoder.cn/        ĵ:http:/www.CrazyCoder.cn/DotNet/Article10510.html                   退出消息循环 
我们知道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。            2008-9-10 17:54:38  
        疯狂代码 http://www.CrazyCoder.cn/ 
展开阅读全文

没有更多推荐了,返回首页