简体   繁体   中英

Draw rectangle with mouse

Is there any way to draw Rectangle with starting and ending points instead of starting point and area?. I am using the following code, to draw rectangle on form via mouse:

    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;
    }

I can draw rectangle with this code, when I move mouse back from its starting point the rectangle should be flip, but instead of doing this my rectangle continues to draw in the opposite direction of the mouse cursor. In short this code works fine while drawing rectangle in forward direction but doesn't work for backward direction.

As Jamiec has mentioned, just call Invalidate in the MouseMove handler, and do the drawing in the OnPaint method / Paint event handler

To draw the correct rectangle forwards or backwards, try this:

Rectangle rect = new Rectangle(Math.Min(e.X, initialX), 
                               Math.Min(e.Y, initialY), 
                               Math.Abs(e.X - initialX), 
                               Math.Abs(e.Y - initialY));

Try this:

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;
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM