2010-01-18 93 views
1

我正在构建MFC应用程序,其中有CDialog和来自CStatic的子控件。在MFC的CStatic中消耗事件并将它们传递给父项

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

 

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

的问题是,从现在父的CDialog不接收鼠标事件,当鼠标移动到MyStatic孩子。我可以从MyStatic手动发送它们,但有什么办法让它们自动通过?并且仍然能够使用消息映射在MyStatic上接收它们?

回答

4

不,你误会了。 SS_NOTIFY不会导致您的CStatic接收消息,它会导致CStatic将消息中继回到父级。所以“现在我能够通过MyStatic中的消息映射直接接收消息事件”基于一个错误的前提。

这是为了因控制只能接收消息本身,而不是它的孩子,除非邮件中继那些孩子们一起玩“或做其他的技巧(全局钩子,很重要的一点... );但是这些情况是例外,“正常”的方式是每个窗口都为自己接收消息。

因此,您可以回答您的问题:不,无法让父母(您的CDialog)和孩子(您的CStatic)在没有手动操作的情况下接收鼠标事件,也无法参与单调乏味的消息路由黑客行为。所以在你的情况下,你需要做的是GetParent() - > SendMessage(WM_LBUTTONDOWN,...)等,手动重新创建WPARAM和LPARAM值;或直接在CDialog上调用OnLButtonDown:GetParent() - > OnLButtonDown(...)。您必须考虑将鼠标坐标传递回CDialog,但可能需要将它们转换为CDialog的客户端坐标。

+0

Roel,谢谢你的解释。但是,除非设置SS_NOTIFY,否则我无法使用消息映射接收消息。也许这是一些奇怪的MFC行为? – 2010-01-21 00:50:23

+0

尝试在您的CStatic中捕获WM_MOUSEMOVE并在其中执行SetFocus()。 – Roel 2010-01-21 08:57:26

1

如果您调用基础OnLButtonDown处理程序,则应将消息发送给父级。

CMyStatic::OnLButtonDown(UINT nFlags, CPoint point) 
{ 
    CStatic::OnLButtonDown(nFlags, point); 

    // custom handling 
} 
+0

这不适合我。我不得不在我的CMyStatic :: OnLButtonDown()方法中使用GetParent() - > SendMessage(WM_COMMAND,GetDlgCtrlID()| WM_LBUTTONDOWN << 16,(LONG)GetSafeHwnd());对于WM_LBUTTONUP和CMyStatic :: OnLButtonUp()也是如此。该技术由[本页]建议(http://www.tenouk.com/visualcplusmfc/visualcplusmfc16b.html)。 – ulatekh 2013-11-20 17:14:13

相关问题