3

有没有办法用起点和终点而不是起点和区域绘制矩形?我正在使用以下代码通过鼠标在表单上绘制矩形:

    System.Drawing.Graphics formGraphics;
    bool isDown = false;
    int initialX;
    int initialY;

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        isDown = true;
        initialX = e.X;
        initialY = e.Y;
    }

    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        if (isDown == true)
        {
            this.Refresh();
            Pen drwaPen = new Pen(Color.Navy,1);
            int width = e.X - initialX, height = e.Y - initialY;
            //if (Math.Sign (width) == -1) width = width 
            //Rectangle rect = new Rectangle(initialPt.X, initialPt.Y, Cursor.Position.X - initialPt.X, Cursor.Position.Y - initialPt.Y);
            Rectangle rect = new Rectangle(initialX, initialY, width * Math.Sign(width), height * Math.Sign(height));

            formGraphics = this.CreateGraphics();
            formGraphics.DrawRectangle(drwaPen, rect);
        }
    }
    private void Form1_MouseUp(object sender, MouseEventArgs e)
    {
        isDown = false;
    }

我可以使用此代码绘制矩形,当我将鼠标从其起点移回时,矩形应该是翻转的,但我的矩形不是这样做,而是继续在鼠标光标的相反方向上绘制。简而言之,此代码在向前方向绘制矩形时工作正常,但在向后方向上不起作用。

4

2 回答 2

8

正如 Jamiec 所提到Invalidate的,只需调用处理程序,并在方法/事件处理程序MouseMove中进行绘图OnPaintPaint

要向前或向后绘制正确的矩形,请尝试以下操作:

Rectangle rect = new Rectangle(Math.Min(e.X, initialX), 
                               Math.Min(e.Y, initialY), 
                               Math.Abs(e.X - initialX), 
                               Math.Abs(e.Y - initialY));
于 2012-10-01T11:47:05.947 回答
-2

试试这个:

private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        IsMouseDown = true; // If This Event Is Occured So This Variable Is True.

        LocationXY = e.Location; // Get The Starting Location Of Point X and Y.
    }

    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        if (IsMouseDown == true) // This Block Is Not Execute Until Mouse Down Event Is Not a Fire.
        {
            LocationX1Y1 = e.Location; // Get The Current Location Of Point X and Y.

            Refresh(); // Refresh the form.
        }
    }

    private void Form1_MouseUp(object sender, MouseEventArgs e)
    {
        if(IsMouseDown == true) // This Block Is Not Execute Until Mouse Down Event Is Not a Fire.
        {
            LocationX1Y1 = e.Location; // Get The Ending Point of X and Y.

            IsMouseDown = false; // false this..
        }
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        if (rect != null) // Check If Rectangle Is Not a null.
        {
            e.Graphics.DrawRectangle(Pens.Red, GetRect()); // GetRect() Is a Function, Now Creates this function.
        }
    }

    private Rectangle GetRect()
    {
    //Create Object Of rect. we define rect at TOP.
        rect = new Rectangle();

    //The x-value of our Rectangle should be the minimum between the start x-value and the current x-position.
        rect.X = Math.Min(LocationXY.X, LocationX1Y1.X);

    //same as above x-value. The y-value of our Rectangle should be the minimum between the start y-value and the current y-position.
        rect.Y = Math.Min(LocationXY.Y, LocationX1Y1.Y);

     //the width of our rectangle should be the maximum between the start x-position and current x-position MINUS.
        rect.Width = Math.Abs(LocationXY.X - LocationX1Y1.X); 

        rect.Height = Math.Abs(LocationXY.Y - LocationX1Y1.Y);

        return rect;
    }
于 2018-08-19T14:39:34.940 回答