关于子窗口处理自身消息而不扩散给父窗口的问题

Posted on 2018-03-29 16:31  moisiet  阅读(429)  评论(0编辑  收藏  举报

窗口上有个Button,你点击Button后,消息响应函数竟然写在窗口类中,也就是说是窗口执行了点击事件,而不是Button本身。为什么我点击了Button,却是窗口在响应呢?

这里面肯定是Button自身没有处理该消息的能力(没有捕获该消息并响应的函数),所以将点击事件消息传给了父窗口,父窗口才调用响应函数完成响应动作的。

但是,当重载Button的BN_CLICKED消息后,就会在Button内部处理这个点击事件,而不再交给父窗口处理了。

那怎么让Button不截获这个消息继续传递给父窗口呢?

1.将重载的ButtonEx内部的消息宏由ON_CONTROL_REFLECT(CLICKED,&CButtonEx::OnBnClicked)改成ON_CONTROL_REFLECT_EX(CLICKED,&CButtonEx::OnBnClicked)

2.将响应函数声明afx_msg void OnBuClicked();改成afx_msg BOOLOnBuClicked();

3.将响应函数添加返回值,即:return FALSE;

总结:

1.MFC在设计的时候,默认情况下,子空间是不处理自身的消息的,而是扩散给父窗口处理。当我们重载子控件并处理它自己的消息后,该消息就不会再扩散了。

如果仍然想要扩散给父窗口,那就用return FALSE表示子控件并没有处理该消息,那样该消息就会扩散出去

2.子控件向父窗口扩散消息发送的是WM_COMMAND消息。当然也可以通过发送自定义消息达到通信的目的。