uwekeim icon

Bubble Mouse Move events from child controls up hierarchy

uwekeim | PRO | 05/23/13 03:02:32 PM UTC | 0 ⭐ | 998 👁️ | Never ⏰ | []
C# |

2.63 KB

|

None

|

0 👍

/

0 👎

public sealed class MouseEventBubbler
{
    // See http://blog.magerquark.de/bubble-mouse-move-events-from-child-controls-up-the-hierarchy-in-windows-forms
 
    private readonly Control _attachTo;
 
    public MouseEventBubbler(Control attachTo)
    {
        _attachTo = attachTo;
 
        _attachTo.MouseMove += _attachTo_MouseMove;
 
        _attachTo.ControlAdded += _attachTo_ControlAdded;
        _attachTo.ControlRemoved += _attachTo_ControlRemoved;
 
        foreach (Control control in _attachTo.Controls)
        {
            AttachToControl(control);
        }
    }
 
    public void _attachTo_MouseMove(object sender, MouseEventArgs e)
    {
        OnMouseMove(e);
    }
 
    public event MouseEventHandler MouseMove;
 
    private void _attachTo_ControlAdded(object sender, ControlEventArgs e)
    {
        AttachToControl(e.Control);
    }
 
    private void _attachTo_ControlRemoved(object sender, ControlEventArgs e)
    {
        DetachFromControl(e.Control);
    }
 
    private void AttachToControl(Control c)
    {
        c.MouseMove += Child_MouseMove;
        c.ControlAdded += Child_ControlAdded;
        c.ControlRemoved += Child_ControlRemoved;
        AttachToChildren(c);
    }
 
    private void AttachToChildren(Control parent)
    {
        foreach (Control child in parent.Controls)
        {
            AttachToControl(child);
        }
    }
 
    private void DetachFromControl(Control c)
    {
        DetachFromChildren(c);
        c.MouseMove -= Child_MouseMove;
        c.ControlAdded -= Child_ControlAdded;
        c.ControlRemoved -= Child_ControlRemoved;
    }
 
    private void DetachFromChildren(Control parent)
    {
        foreach (Control child in parent.Controls)
        {
            DetachFromControl(child);
        }
    }
 
    private void Child_ControlAdded(object sender, ControlEventArgs e)
    {
        AttachToControl(e.Control);
    }
 
    private void Child_ControlRemoved(object sender, ControlEventArgs e)
    {
        DetachFromControl(e.Control);
    }
 
    private void Child_MouseMove(object sender, MouseEventArgs e)
    {
        var pt = e.Location;
        var child = (Control)sender;
        do
        {
            pt.Offset(child.Left, child.Top);
            child = child.Parent;
        }
        while (child != _attachTo);
 
        var newArgs = new MouseEventArgs(e.Button, e.Clicks, pt.X, pt.Y, e.Delta);
        OnMouseMove(newArgs);
    }
 
    private void OnMouseMove(MouseEventArgs newArgs)
    {
        var h = MouseMove;
        if (h != null)
        {
            h(this, newArgs);
        }
    }
}

Comments