示例#1
0
        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);
        }