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

来源:互联网 发布:oa办公系统java代码 编辑:程序博客网 时间:2024/05/04 21:39

  转载请表明出处

退出消息循环
我们知道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_DESTROYWM_NCDESTROY 被发送给窗口过程。这消息处理完后,窗口完全被
摧毁。
这样,在窗口被摧毁之前,我们有至少4此机会被通知,WM_SYSCOMMANDWM_CLOSEWM_DESTROYWM_NCDESTROY
反过来说,我们要关闭一个窗口时候,可以发送WM_SYSCOMMANDWM_CLOSE消息。为什么不通过发送WM_DESTROYWM_NCDESTROY呢。看看上面的处理过程,如果通过发送WM_DESTROYWM_NCDESTROY,那么DestroyWindow函数的处理怎么办呢?对了,直接调用DestroyWindow不就是了。
在进一步,如果窗口关闭后,我们想退出线程怎么办?好办,WM_DESTROY的时候,PostQuitMessage发送WM_QUITOK了。想想,为什么不在WM_CLOSE的时候发送WM_QUIT
 
原创粉丝点击