protected internal override void OnMouseMove(object sender, MouseEventArgs e) { base.OnMouseMove(sender, e); if (canvas.IsResizing || canvas.Layers[canvas.SelectedLayer].Locked) { return; } var query = canvas.SelectedLayer .Where(x => x.Contains(new PointF(e.X / canvas.ZoomFactor, e.Y / canvas.ZoomFactor))) .OrderBy(x => x.Z) .LastOrDefault(); DragHandle handleQuery = null; if (query != null) { if (!_moving) { canvas.Cursor = Cursors.Hand; } } else { if (handleQuery == null) { canvas.Cursor = Cursors.Default; } } if (Target != null && Target.Selected && !_resizing) { handleQuery = Target.Bounds.DragHandles .Where(x => x.Contains(new PointF(e.X / canvas.ZoomFactor, e.Y / canvas.ZoomFactor))) .LastOrDefault(); if (handleQuery != null) { _resizeHandle = handleQuery; canvas.Cursor = resizeCursorMap[handleQuery.Anchor]; } } if (_moving) { var deltaX = e.X / canvas.ZoomFactor - Position1.X; var deltaY = e.Y / canvas.ZoomFactor - Position1.Y; Target.Move(deltaX, deltaY, canvas.Size); Position1 = e.Location; canvas.Invalidate(); } else if (_resizing) { var nextPosition = PointF.Empty; switch (_resizeHandle.Anchor) { case DragHandleAnchor.BottomCenter: case DragHandleAnchor.TopCenter: if (_fixedX == null) { _fixedX = Target.Bounds.Right; } nextPosition = new PointF((float)_fixedX, e.Y / canvas.ZoomFactor); break; case DragHandleAnchor.MiddleLeft: case DragHandleAnchor.MiddleRight: if (_fixedY == null) { _fixedY = Target.Bounds.Right; } nextPosition = new PointF(e.X / canvas.ZoomFactor, (float)_fixedY); break; default: nextPosition = new PointF(e.X / canvas.ZoomFactor, e.Y / canvas.ZoomFactor); break; } Target.Bounds = new Boundary(Position1, nextPosition); canvas.Invalidate(); } }