void SignalModelContainer_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { if (activeSignal != null && ClientRectangle.Contains(e.X, e.Y)) { Rectangle r1 = activeSignal.Bounds; activeSignal.Location = new Point(e.X - activeLocationX, e.Y - activeLocationY); int left = Math.Max(0, Math.Min(r1.Left, activeSignal.Location.X)); int top = Math.Max(0, Math.Min(r1.Top, activeSignal.Location.Y)); int right = Math.Max(left + r1.Width, activeLocationX + activeSignal.Width); int bottom = Math.Max(top + r1.Height, activeLocationY + activeSignal.Height); Rectangle r2 = new Rectangle(left, top, right + 10, bottom + 10); Region region = new Region(r1); region.Union(r2); region.Union(activeSignal.getAffectedRegion()); Invalidate(region); Update(); activeLocationX = e.X - activeSignal.Location.X; activeLocationY = e.Y - activeSignal.Location.Y; } } }