tags:

views:

217

answers:

2

Hello,

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 child. 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?

Thanks.

+1  A: 

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.

Roel
Roel, thank you for explanation. However unless setting SS_NOTIFY I was not able to receive messages using message map. Maybe this is some weird MFC behavior?
Petr Havlicek
Try catching WM_MOUSEMOVE in your CStatic and doing SetFocus() in there.
Roel
+1  A: 

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
}
Aidan Ryan