Consume events in MFC's CStatic and pass them to the parent
I am building MFC application where there is CDialog with child control derived from CStatic on it.
I want to receive mouse events for CStatic control so I set "Notify"
for it to true. Now I am able to receive message events through message map directly in MyStatic
:
class CMyStatic : public CStatic
{
afx_msg void OnLButtonDown(UINT nFlags, CPoint point); // Gets invoked
DECLARE_MESSAGE_MAP()
}
The problem is that from now the parent CDialog is not receiving mouse events when mouse is over MyStatic
c开发者_StackOverflowhild. I can send them from MyStatic
manually but is there any way to let them go through automatically? And still be able to receive them also on MyStatic
using message maps?
No, you're misunderstanding. SS_NOTIFY does not cause your CStatic to receive messages, it causes the CStatic to relay messages back to the parent. So "Now I am able to receive message events through message map directly in MyStatic" is based on a false premise.
This is an important point to make because a control can only receive messages for itself, not for its children, unless those children 'play along' by relaying messages or by doing other tricks (global hooking, ...) ; but those cases are the exception, the 'normal' way is that each window receives messages for itself.
So that answers your question: no, there is no way to let both a parent (your CDialog) and a child (your CStatic) receive mouse events without doing so 'manually' or getting involved in tedious message routing hacks. So in your case, what you need to do is GetParent()->SendMessage(WM_LBUTTONDOWN, ...) etc, manually recreating the WPARAM and LPARAM values; or calling OnLButtonDown directly on the CDialog: GetParent()->OnLButtonDown(...). You'll have to think about what mouse coordinates you pass back to CDialog though, you may need to translate them to the CDialog's client coordinates.
If you call the base OnLButtonDown handler, the message should be sent to the parent.
CMyStatic::OnLButtonDown(UINT nFlags, CPoint point)
{
CStatic::OnLButtonDown(nFlags, point);
// custom handling
}
精彩评论