简体   繁体   中英

Draw rectangle with negative coordinates

When i'm trying to draw a rectangle in PictureBox with negative coordinates (-x and -y) the rectangle dissapears, though when it has positive coordinates everything is okay. Here's the code:

Here I get starting coordinates of rectangle

private void PictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    start_point.X = e.X;
    start_point.Y = e.Y;
}

Here I get the ending coordinates of rectangle:

private void PictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        end_point.X = e.X;
        end_point.Y = e.Y;
        PictureBox1.Refresh();
    }
}

Here I calculate the rectangles width and height:

private void PictureBox1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.FillRectangle(sb, start_point.X, start_point.Y, end_point.X - start_point.X, end_point.Y - start_point.Y);
}

If the starting point coordinates are smaller than ending ones, everything works just fine, but when the ending coordinates are smaller than starting ones, the width or height or both values are negative... How can I solve this problem?

There are 4 possible ways for the user to drag the mouse to make the rectangle. Only one of them you're happy with right now, from upper-left to lower-right. The other 3 ways produce negative values for the rectangle's Width or Height. You deal with all 4 possibilities like this:

var rc = new Rectangle(
    Math.Min(startpoint.x, endpoint.x), 
    Math.Min(startpoint.y, endpoint.y),
    Math.Abs(endpoint.x - startpoint.x),
    Math.Abs(endpoint.y - startpoint.y));
e.Graphics.FillRectangle(sb, rc);

If the starting X is < the ending X, just swap the values before drawing. Same for the Y coordinates.

if ( start_point.X < end_point.X )
{
    var oldX = start_point.X;
    start_point.X = end_point.X;
    end_point.X = oldX;
}

if ( start_point.Y < end_point.Y )
{
    var oldY = start_point.Y;
    start_point.Y = end_point.Y;
    end_point.Y = oldY;
}

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