Как я могу нарисовать прямоугольники в C #, когда позиция перемещается сверху слева в начальную позицию? - PullRequest
2 голосов
/ 21 июня 2011

Итак, я пытаюсь позволить пользователю рисовать прямоугольники на форме, и все идет хорошо, когда я рисую сверху вниз, справа внизу. Как только позиция X или Y станет меньше оригинала, он прекращает рисование и прямоугольник исчезает.

Я внес некоторые изменения в метод рисования, чтобы попытаться отрегулировать его положение и переместить его туда, где он должен быть, чтобы имитировать это поведение, но оно просто не работает правильно. Есть ли лучший способ сделать это? Я могу получить несколько прямоугольников на экране и даже двойной щелчок, чтобы обнаружить и удалить их. Я просто не могу заставить их рисовать в любом другом направлении, кроме нижнего правого

    // All rectangles saved to the form
    private List<Rectangle> rects;

    // Current rectangle if one is being drawn
    private Rectangle tempRect;

    public Form1()
    {
        InitializeComponent();
        rects = new List<Rectangle>();
    }

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        tempRect = new Rectangle(e.X, e.Y, 0, 0);
        this.Invalidate();
    }

    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            int tempX = tempRect.X;
            int tempY = tempRect.Y;
            int tempWidth = tempRect.Width;
            int tempHeight = tempRect.Height;

            if (e.X < tempRect.Location.X)
            {
                tempX = e.X;
                tempWidth = tempRect.Width + (tempRect.Location.X - e.X);
            }
            else
                tempWidth = e.X - tempRect.Location.X;

            if (e.Y < tempRect.Location.Y)
            {
                tempY = e.Y;
                tempHeight = tempRect.Height + (tempRect.Location.Y - e.Y);
            }
            else
                tempHeight = e.Y - tempRect.Location.Y;

            Point rectLocation = new Point(tempX, tempY);
            Size rectSize = new Size(tempWidth, tempHeight);

            tempRect = new Rectangle(rectLocation, rectSize);
            this.Invalidate();
        }
    }

    private void Form1_MouseUp(object sender, MouseEventArgs e)
    {
        // Must be within constraint, prevents tiny invisible rectangles from being added
        if (tempRect.Width >= 10 && tempRect.Height >= 10)
            rects.Add(tempRect);
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        using (Pen pen = new Pen(Color.Black, 2))
        {
            // Redraws all existing rectangles onto the form
            foreach (Rectangle rect in rects)
                e.Graphics.DrawRectangle(pen, rect);

            // Must be within constraint, prevents tiny invisible rectangles from being added
            if (tempRect.Width >= 10 && tempRect.Height >= 10)
                e.Graphics.DrawRectangle(pen, tempRect);
        }
    }

1 Ответ

3 голосов
/ 21 июня 2011

Вы можете значительно упростить свой код.Вместо создания tempRect, когда мышь не работает, вы можете создать tempStartPoint.Таким образом, вам не понадобится так много манипуляций в обработчике событий MouseMove, весь код будет сводиться к одной инструкции:

tempRect =
    new Rectangle(
        Math.Min(tempStartPoint.X, tempEndPoint.X),
        Math.Min(tempStartPoint.Y, tempEndPoint.Y),
        Math.Abs(tempStartPoint.X - tempEndPoint.X),
        Math.Abs(tempStartPoint.Y - tempEndPoint.Y));

Полный код:

public partial class Form1 : Form
{
    private readonly List<Rectangle> rects = new List<Rectangle>();
    private Point tempStartPoint;
    private Rectangle tempRect;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        tempStartPoint = e.Location;
        Invalidate();
    }

    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button != MouseButtons.Left)
            return;
        Point tempEndPoint = e.Location;
        tempRect =
            new Rectangle(
                Math.Min(tempStartPoint.X, tempEndPoint.X),
                Math.Min(tempStartPoint.Y, tempEndPoint.Y),
                Math.Abs(tempStartPoint.X - tempEndPoint.X),
                Math.Abs(tempStartPoint.Y - tempEndPoint.Y));
        Invalidate();
    }

    private void Form1_MouseUp(object sender, MouseEventArgs e)
    {
        // Must be within constraint, prevents tiny invisible rectangles from being added
        if (tempRect.Width >= 10 && tempRect.Height >= 10)
            rects.Add(tempRect);
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        using (Pen pen = new Pen(Color.Black, 2))
        {
            // Redraws all existing rectangles onto the form
            foreach (Rectangle rect in rects)
                e.Graphics.DrawRectangle(pen, rect);

            // Must be within constraint, prevents tiny invisible rectangles from being added
            if (tempRect.Width >= 10 && tempRect.Height >= 10)
                e.Graphics.DrawRectangle(pen, tempRect);
        }
    }
}
...