public override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); //var someoneHit = false; SkinnableControl ctl = controls.FirstOrDefault(c => c.Capture); if (ctl == null) { ctl = controls.FirstOrDefault(c => c.HitTest(e.Location)); if (ctl != null) { if (lastEnterControl != ctl) { // Lanciamo mouseLeave / mouseEnter sul vecchio / nuovo controllo sopra il quale ci troviamo. if (lastEnterControl != null) { lastEnterControl.OnMouseLeave(new EventArgs()); } lastEnterControl = ctl; ctl.OnMouseEnter(new EventArgs()); } MouseEventArgs e2 = new MouseEventArgs(e.Button, e.Clicks, e.X - (int)Math.Round(ctl.Left, 0, MidpointRounding.ToEven), e.Y - (int)Math.Round(ctl.Top, 0, MidpointRounding.ToEven), e.Delta); ctl.OnMouseMove(e2); } else { // Non ci troviamo sopra a nessun controllo: se qualcuno dei nostri // controlli aveva il mouseEnter, gli chiamiamo mouseLeave. if (lastEnterControl != null) { lastEnterControl.OnMouseLeave(new EventArgs()); lastEnterControl = null; } } } else { MouseEventArgs e2 = new MouseEventArgs(e.Button, e.Clicks, e.X - (int)Math.Round(ctl.Left, 0, MidpointRounding.ToEven), e.Y - (int)Math.Round(ctl.Top, 0, MidpointRounding.ToEven), e.Delta); ctl.OnMouseMove(e2); } }