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

如果起点坐标小于终点坐标,一切正常,但是当终点坐标小于起点坐标时,宽度或高度或两个值都是负数......我该如何解决这个问题?

4

2 回答 2

16

用户有 4 种可能的方式来拖动鼠标来制作矩形。从左上角到右下角,您现在只对其中一个感到满意。其他 3 种方式为矩形的宽度或高度产生负值。您可以像这样处理所有 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);
于 2013-11-06T22:22:56.140 回答
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;
}
于 2013-11-06T22:04:51.743 回答