用负坐标绘制矩形

8
当我尝试在PictureBox中绘制具有负坐标(-x和-y)的矩形时,矩形会消失,但当它具有正坐标时,一切正常。这是代码:
这里获取矩形的起始坐标。
private void PictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    start_point.X = e.X;
    start_point.Y = e.Y;
}

这里我获取矩形的结束坐标:

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

在这里我计算矩形的宽度和高度:

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

如果起始点坐标小于结束点坐标,一切都可以正常工作,但当结束点坐标小于起始点坐标时,宽度或高度或两者的值为负数...我该怎么解决这个问题?

2个回答

18

用户拖动鼠标以绘制矩形有4种可能的方式。目前只有其中一种方式是您所满意的,即从左上角到右下角。其他三种方式会导致矩形的宽度或高度产生负值。您可以按照以下方式处理这4种情况:

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

1
谢谢你,Hans,你帮了我很多! - user2962453
1
这个答案简单而且很棒。 - Ali Ezzat Odeh

1
如果起始X小于结束X,则在绘制之前交换这些值。Y坐标同理。
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;
}

无用!条件错误“<”->“>”。开始值不应大于结束值。 其次,每个周期必须覆盖起点,不能在负鼠标移动时绘制矩形,每个起点都被覆盖。 - raiserle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接