在MFC的CStatic中使用事件并将它们传递给父级

Pet*_*cek 1 events mfc event-bubbling

我正在构建MFC应用程序,其中CDialog带有源自CStatic的子控件.

我想接收CStatic控件的鼠标事件,所以我将"Notify"它设置为true.现在,我可以直接通过消息映射接收消息事件MyStatic:


class CMyStatic : public CStatic
{
afx_msg void OnLButtonDown(UINT nFlags, CPoint point); // Gets invoked
DECLARE_MESSAGE_MAP()
}

问题是,从现在开始,当鼠标超过MyStatic子节点时,父CDialog不会接收鼠标事件.我可以MyStatic手动发送它们但有没有办法让它们自动通过?还能够MyStatic使用消息地图接收它们吗?

Roe*_*oel 5

不,你是误会.SS_NOTIFY不会导致您的CStatic接收消息,它会导致CStatic将消息中继回父节点.所以"现在我能够直接在MyStatic中通过消息映射接收消息事件"是基于错误的前提.

这是一个重要的观点,因为控件只能为自己接收消息,而不能为其子节点接收消息,除非这些孩子通过转发消息或通过其他技巧(全局挂钩,......)来"玩".但这些情况是例外,"正常"方式是每个窗口自己接收消息.

这样回答你的问题:没有,有没有办法让双方父母(你的CDialog)和孩子(你的静态控件)接收鼠标事件没有这么"手动"做或卷入繁琐的消息路由黑客.所以在你的情况下,你需要做的是GetParent() - > SendMessage(WM_LBUTTONDOWN,...)等,手动重新创建WPARAM和LPARAM值; 或直接在CDialog上调用OnLButtonDown:GetParent() - > OnLButtonDown(...).您必须考虑将传递回CDialog的鼠标坐标,您可能需要将它们转换为CDialog的客户端坐标.