Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement