鱼C论坛

 找回密码
 立即注册
查看: 3335|回复: 9

为什么之后不会去WM_DESTROY那里呢?

[复制链接]
发表于 2016-6-29 11:59:05 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 宋桓公 于 2016-6-30 10:28 编辑

1. 当用户点击右上角关闭按钮的时候,请给下列Windows做出的响应排个序:A:发送 WM_QUIT 消息     B:发送 WM_CLOSE 消息     C:发送 WM_DESTROY 消息     D:发送 WM_NCDESTROY 消息     F:发送 WM_COMEBABY 消息


既然点击右上角关闭按钮,会发送这么多消息,那么为什么之后不会去WM_DESTROY那里呢?

点击右上角关闭按钮,依次会产生WM_CLOSE,WM_DESTROY  WM_NCDESTROY,WM_QUIT
WM_CLOSE被拦截之后,后面的消息都不响应了吗?
        case WM_CLOSE://这里有个疑问,关闭按下后,不止产生一个消息,为什么之后不会去WM_DESTROY那里呢?
                MessageBox(hwnd,TEXT("说了,关闭按钮在窗口中找找吧!"),TEXT("警告!"),MB_OK);
                return 0;


        case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
        }

        return DefWindowProc(hwnd, message, wParam, lParam);

感谢@无符号整型 的讲解~~~,一下是我测试的图片
1.jpg

总结:
        点击右上角关闭按钮,依次会产生WM_CLOSE,WM_DESTROY  WM_NCDESTROY,WM_QUIT 。但是这4个消息并非是由点击右上角关闭按钮直接产生的。

        点击右上角关闭按钮直接产生的,仅仅是WM_CLOSE消息,如果我们没有去捕获WM_CLOSE,或者捕获后使用的是break而不是return,那么DefWindowProc有机会执行。

        DefWindowProc是一个会产生消息的函数,当WM_CLOSE消息产生之后,如果去执行了DefWindowProc函数,那么他会
接着依次连续产生WM_DESTROY  WM_NCDESTROY这两个消息。

        而在WM_DESTROY处理函数中写上了PostQuitMessage(0)这个函数,WM_QUIT 是由这个函数参数的。WM_QUIT这个消息
在过程函数(WndProc)中无法捕捉到,因为在GetMessage的时候捕获到WM_QUIT 时返回值为0,就会导致主函数退出了。
       
        所以,整个过程就是:
1、点击右上角关闭按钮,产生WM_CLOSE消息。
2、DefWindowProc(hwnd, message, wParam, lParam);被调用产生WM_DESTROY  WM_NCDESTROY这两个消息。
3、WM_DESTROY  WM_NCDESTROY(如果你捕获了)的处理函数会被执行,在执行WM_DESTROY处理函数是调用PostQuitMessage(0)
产生了WM_QUIT 消息。
4、GetMessage的时候捕获到WM_QUIT 时返回值为0,就会导致主函数退出了。



最佳答案

查看完整内容

没错的,吧return0换成break肯定行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-29 11:59:06 | 显示全部楼层
宋桓公 发表于 2016-6-29 18:55
您的意思是否是,如果我不写WM_CLOSE的处理函数。
才会参数WM_DESTROY  WM_NCDESTROY,WM_QUIT 这一系列 ...

没错的,吧return0换成break肯定行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-29 17:44:59 | 显示全部楼层
本帖最后由 无符号整形 于 2016-6-29 17:48 编辑

WM_CLOSE消息返回0就是拦截WM_CLOSE消息了(不给默认的过程函数处理)!默认的过程函数不知道当然不发送WM_DESTROY
再啰嗦几句:WM_CLOSE才是系统发送的,WM_DESTROY是默认的过程函数发送的!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-6-29 18:46:33 | 显示全部楼层
无符号整形 发表于 2016-6-29 17:44
WM_CLOSE消息返回0就是拦截WM_CLOSE消息了(不给默认的过程函数处理)!默认的过程函数不知道当然不发送WM_ ...

请问:
WM_DESTROY是默认的过程函数发送的

这句话是什么意思?过程函数可以发送消息?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-29 18:49:09 | 显示全部楼层
宋桓公 发表于 2016-6-29 18:46
请问:
WM_DESTROY是默认的过程函数发送的

不是这个意思
默认的过程函数是指DefWindowProc
过程函数才是WndProc
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-6-29 18:49:26 | 显示全部楼层
点击右上角关闭按钮,依次会产生WM_CLOSE,WM_DESTROY  WM_NCDESTROY,WM_QUIT
WM_CLOSE被拦截之后,后面的消息都不响应了吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-29 18:52:46 | 显示全部楼层
宋桓公 发表于 2016-6-29 18:49
点击右上角关闭按钮,依次会产生WM_CLOSE,WM_DESTROY  WM_NCDESTROY,WM_QUIT
WM_CLOSE被拦截之后,后面 ...

嗯嗯是的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-6-29 18:55:36 | 显示全部楼层

您的意思是否是,如果我不写WM_CLOSE的处理函数。
才会参数WM_DESTROY  WM_NCDESTROY,WM_QUIT 这一系列的消息。
而这些消息,是由DefWindowProc产生的。

是这样理解吗?谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-6-29 18:58:06 | 显示全部楼层

回头试试,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-11 23:54:24 | 显示全部楼层
请教下,为了发出WM_QUIT消息,说可以使用PostQuitMessage函数来发送;那么使用PostMessage、SendMesage函数是否也可以呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 06:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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