为什么之后不会去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 18:55
您的意思是否是,如果我不写WM_CLOSE的处理函数。
才会参数WM_DESTROYWM_NCDESTROY,WM_QUIT 这一系列 ...
没错的,吧return0换成break肯定行 本帖最后由 无符号整形 于 2016-6-29 17:48 编辑
WM_CLOSE消息返回0就是拦截WM_CLOSE消息了(不给默认的过程函数处理)!默认的过程函数不知道当然不发送WM_DESTROY
再啰嗦几句:WM_CLOSE才是系统发送的,WM_DESTROY是默认的过程函数发送的! 无符号整形 发表于 2016-6-29 17:44
WM_CLOSE消息返回0就是拦截WM_CLOSE消息了(不给默认的过程函数处理)!默认的过程函数不知道当然不发送WM_ ...
请问:
WM_DESTROY是默认的过程函数发送的
这句话是什么意思?过程函数可以发送消息? 宋桓公 发表于 2016-6-29 18:46
请问:
WM_DESTROY是默认的过程函数发送的
不是这个意思
默认的过程函数是指DefWindowProc
过程函数才是WndProc 点击右上角关闭按钮,依次会产生WM_CLOSE,WM_DESTROYWM_NCDESTROY,WM_QUIT
WM_CLOSE被拦截之后,后面的消息都不响应了吗?
宋桓公 发表于 2016-6-29 18:49
点击右上角关闭按钮,依次会产生WM_CLOSE,WM_DESTROYWM_NCDESTROY,WM_QUIT
WM_CLOSE被拦截之后,后面 ...
嗯嗯是的 无符号整形 发表于 2016-6-29 18:52
嗯嗯是的
您的意思是否是,如果我不写WM_CLOSE的处理函数。
才会参数WM_DESTROYWM_NCDESTROY,WM_QUIT 这一系列的消息。
而这些消息,是由DefWindowProc产生的。
是这样理解吗?谢谢! 无符号整形 发表于 2016-6-29 18:52
嗯嗯是的
回头试试,谢谢! 请教下,为了发出WM_QUIT消息,说可以使用PostQuitMessage函数来发送;那么使用PostMessage、SendMesage函数是否也可以呢?
页:
[1]