宋桓公 发表于 2016-6-29 11:59:05

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

本帖最后由 宋桓公 于 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_DESTROYWM_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);


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


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

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

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

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



无符号整形 发表于 2016-6-29 11:59:06

宋桓公 发表于 2016-6-29 18:55
您的意思是否是,如果我不写WM_CLOSE的处理函数。
才会参数WM_DESTROYWM_NCDESTROY,WM_QUIT 这一系列 ...

没错的,吧return0换成break肯定行

无符号整形 发表于 2016-6-29 17:44:59

本帖最后由 无符号整形 于 2016-6-29 17:48 编辑

WM_CLOSE消息返回0就是拦截WM_CLOSE消息了(不给默认的过程函数处理)!默认的过程函数不知道当然不发送WM_DESTROY
再啰嗦几句:WM_CLOSE才是系统发送的,WM_DESTROY是默认的过程函数发送的!

宋桓公 发表于 2016-6-29 18:46:33

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

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

这句话是什么意思?过程函数可以发送消息?

无符号整形 发表于 2016-6-29 18:49:09

宋桓公 发表于 2016-6-29 18:46
请问:
WM_DESTROY是默认的过程函数发送的



不是这个意思
默认的过程函数是指DefWindowProc
过程函数才是WndProc

宋桓公 发表于 2016-6-29 18:49:26

点击右上角关闭按钮,依次会产生WM_CLOSE,WM_DESTROYWM_NCDESTROY,WM_QUIT
WM_CLOSE被拦截之后,后面的消息都不响应了吗?

无符号整形 发表于 2016-6-29 18:52:46

宋桓公 发表于 2016-6-29 18:49
点击右上角关闭按钮,依次会产生WM_CLOSE,WM_DESTROYWM_NCDESTROY,WM_QUIT
WM_CLOSE被拦截之后,后面 ...

嗯嗯是的

宋桓公 发表于 2016-6-29 18:55:36

无符号整形 发表于 2016-6-29 18:52
嗯嗯是的

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

是这样理解吗?谢谢!

宋桓公 发表于 2016-6-29 18:58:06

无符号整形 发表于 2016-6-29 18:52
嗯嗯是的

回头试试,谢谢!

hustjinghu 发表于 2016-11-11 23:54:24

请教下,为了发出WM_QUIT消息,说可以使用PostQuitMessage函数来发送;那么使用PostMessage、SendMesage函数是否也可以呢?
页: [1]
查看完整版本: 为什么之后不会去WM_DESTROY那里呢?