我想在图片框C#上绘制Square

时间:2014-05-19 08:01:47

标签: c# winforms

我想在图像上绘制Square而不是矩形,当我执行鼠标移动操作到Top,Left,Bottom,Right方向时,它的高度和宽度将以相同的长度增加。

下面是我的代码它不显示方形我想要方形的确切代码

    public Form1()
    {
        InitializeComponent();
    }

    Rectangle currRect;
    Point endPoint;
    bool isDrag;
    Point startPoint;
    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        startPoint = new Point(e.X, e.Y); //
        if (e.Button == MouseButtons.Left)
        {
            currRect = new Rectangle();
            currRect.X = startPoint.X;
            currRect.Y = startPoint.Y;
            isDrag = true;
        }
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (isDrag)
        {
            endPoint = new Point(e.X, e.Y);
            currRect.Width = endPoint.X - startPoint.X;
            currRect.Height = endPoint.Y - startPoint.Y;
        }
    }

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {
        isDrag = false;
        Graphics graphics = this.pictureBox1.CreateGraphics();
        graphics.DrawRectangle(new Pen(Brushes.Red), currRect.X, currRect.Y, currRect.Width, currRect.Height);

    }

当我要增加其起点的平方大小时,或者当我在顶部,左侧,底部,右侧方向上增加时,我们可以说它的Top,Left co-ord保持稳定或恒定,这也是一件事。

当我移动鼠标光标时,这个起点不稳定,它的起点变了,我不想这样,请帮我弄清楚这种情况

2 个答案:

答案 0 :(得分:2)

您的代码正在绘制一个矩形,而不是正方形。如果要绘制正方形,则需要使宽度和高度相同。

如果您将pictureBox1_MouseMove方法修改为此方法,则可以绘制一个长度等于宽度和高度最大值的正方形:

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (isDrag)
    {
        endPoint = new Point(e.X, e.Y);
        int maxLength = Math.Max(endPoint.X - startPoint.X, endPoint.Y - startPoint.Y);
        currRect.Width = maxLength;
        currRect.Height = maxLength;
    }
}

编辑:这是您可以用来从任何方向绘制正方形的解决方案:

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (isDrag)
    {
        endPoint = new Point(e.X, e.Y);
        currRect.X = Math.Min(startPoint.X, endPoint.X);
        currRect.Y = Math.Min(startPoint.Y, endPoint.Y);
        int maxLength = Math.Max(Math.Abs(startPoint.X - endPoint.X), Math.Abs(startPoint.Y - endPoint.Y));
        currRect.Width = maxLength;
        currRect.Height = maxLength;
    }
}

答案 1 :(得分:1)

替换

graphics.DrawRectangle(new Pen(Brushes.Red), currRect.X, currRect.Y, currRect.Width, currRect.Height);

人:

graphics.DrawRectangle(new Pen(Brushes.Red), currRect.X, currRect.Y, Math.Min(currRect.Width, currRect.Height), Math.Min(currRect.Width, currRect.Height));

其次,我不知道起点如何变化?

相关问题