sealed protected override void SetEndLocation(Point end, Keys modifiers, Point location) { var start = Start; var rect = new Rectangle(); var aspect = BGICanvas.ASPECT; var size = Size.Abs(new Size(end - start)); if (modifiers.HasFlag(Keys.Shift)) { IsSquare = true; int diameter = Math.Max(size.Width, (int)Math.Round(size.Height / aspect)); if (modifiers.HasFlag(Keys.Alt)) { IsCentered = true; rect.Location = new Point(start - new Point(diameter, (int)Math.Round(diameter * aspect))); diameter *= 2; } else { IsCentered = false; rect.Location = new Point( (end.X < start.X) ? start.X - diameter : start.X, (end.Y < start.Y) ? start.Y - (int)Math.Round(diameter * aspect) : start.Y ); } rect.Size = new Size( diameter + 1, (int)Math.Round(diameter * aspect) + 1 ); } else { IsSquare = false; if (modifiers.HasFlag(Keys.Alt)) { IsCentered = true; rect.Location = start - size; size *= new Size(2, 2); rect.Size = size + 1; } else { IsCentered = false; rect.Size = size + 1; rect.Location = new Point( (end.X < start.X) ? start.X - size.Width : start.X, (end.Y < start.Y) ? start.Y - size.Height : start.Y ); } } SetPosition(rect); }