17638727142 发表于 2018-12-23 19:33:49

PostQuitMessage的用法还是不太明白?求大佬解决

点了右上角的×号之后,发出WM_CLOSE消息,然后调用DestroyWindows函数,这个函数的作用不就是释放窗口内存吗?释放完之后不就没事了吗?为什么还要PostQuitMessage呢???

ba21 发表于 2018-12-23 19:41:00

2个函数的说明都说得很明白

先看DestroyWindow
DestroyWindow的处理过程总结要点如下:
1. 向父窗口发送WM_PARENTNOTIFY消息(仅当窗口具有WS_EX_NOPARENTNOTIFY样式);
2. 向窗口发送WM_DESTROY消息;
3. 使窗口转入非活动状态,移除键盘焦点;
4. 销毁子窗口(应该是通过递归调用DestroyWindow完成);
5. 销毁目标窗口资源:销毁菜单,清空线程的消息队列,销毁与窗口过程相关的定时器,解除窗口对剪贴板的拥有权,打断剪贴板器的查看链;
6. 向窗口发送WM_NCDESTROY消息;

上述条目大致从前往后执行(1、2、3的顺序不一定,5、6的顺序不一定)。依据是:
1. 根据WM_PARENTNOTIFY说明:销毁窗口时,系统在任何销毁窗口的操作执行前发送WM_PARENTNOTIFY至父窗口;
2. 根据WM_DESTROY说明:此消息先被发送至目标窗口,然后发送给目标窗口的所有子窗口,处理此消息时,可以假定所有子窗口还存在着;
3. 根据DestroyWindow说明:函数先销毁子窗口及所拥有的窗口,然后销毁目标窗口;
4. 根据WM_NCDESTROY说明:与WM_DESTROY相反的是,此消息在所有子窗口销毁之后发送; 没有去看汇编代码,只是根据各个MSDN说明来大致推测的,基本够用了吧。

根据MSDN说明,不能在非创建线程上调用DestroyWindow;若要在其它线程上关闭窗口,不可以直接调用DestroyWindow(错误"拒绝访问"),也不可以只发送WM_DESTROY,因为DestroyWindow才能完整的关闭窗口,WM_DESTROY消息只是关闭流程的一部分,甚至是最"无用"的一部分--WM_DESTROY只是用户响应的接口,而真正清理窗口的工作由DestroyWindow的其它部分完成。
要在其它线程上关闭窗口,可以向窗口发送WM_CLOSE消息,若窗口过程未在WM_CLOSE的处理中取消关闭操作,则DefWindowProc会默认调用DestroyWindow(彼时自然是在窗口的创建线程上)。


再看 PostQuitMessage
PostQuitMessage,函数名。该函数向系统表明有个线程有终止请求。通常用来响应WM_DESTROY消息。

PostQuitMessage寄送一个WM_QUIT消息给线程的消息队列并立即返回;此函数向系统表明有个线程请求在随后的某一时间终止。
当线程从消息队列里取得WM_QUIT消息时,应当退出消息循环并将控制返回给系统。返回给系统的退出值必须是消息WM_QUIT的wParam参数。
页: [1]
查看完整版本: PostQuitMessage的用法还是不太明白?求大佬解决