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

  • 格式:pdf
  • 大小:88.62 KB
  • 文档页数:2

用户界面线程:界面线程的退出 窗口关闭的流程
疯狂代码 / ĵ:http://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
疯狂代码 /。