鱼C论坛

 找回密码
 立即注册
查看: 2739|回复: 1

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

[复制链接]
发表于 2018-12-23 19:33:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
点了右上角的×号之后,发出WM_CLOSE消息,然后调用DestroyWindows函数,这个函数的作用不就是释放窗口内存吗?释放完之后不就没事了吗?为什么还要PostQuitMessage呢???
搜狗截图20181223191832.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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参数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 22:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表