选择和移动形状对象

时间:2021-05-15 16:05:00

标签: c# winforms

目前,我正在开发一个基于 Windows 窗体的简单绘图应用程序。我需要一种方法来允许我选择当前对象并移动它。 它基于Points绘制形状,例如Triangle类,并将它们存储在List中:

using System.Drawing;

namespace DrawingApplication
{
   class Triangle : Shape
   {
       string label;
       int triangleIndex; 
       Point[] pnt = new Point[3];

       public Triangle(string label, int triangleIndex, Point[] inputPoints) : base(label, triangleIndex, inputPoints)
       {
           this.label = label;
           this.triangleIndex = triangleIndex;
           this.pnt = inputPoints;
       }

       public void draw(Graphics g, Pen blackPen)
       {
           g.DrawPolygon(blackPen, pnt);
       }
    }
}

我尝试了不同的方法来选择对象,但没有用。任何人都可以提供有助于找到解决方案的建议吗?

if (selectTriangleStatus)
{
    if (clicknumber == 0)
    {
        one = new Point(e.X, e.Y);
        clicknumber = 1;
    } 
    else if (clicknumber == 1)
    {
        two = new Point(e.X, e.Y);
        clicknumber = 2;
    }
    else
    {
        three = new Point(e.X, e.Y);
        Point[] tempPoints = { one, two, three };

        numTriangles++;
        string label = "Triangle";
        Triangle aShape = new Triangle(label, numTriangles ,tempPoints);

        ShapesList.Add(aShape);
        selectTriangleStatus = false;
        clearCoordinates();
    }
}

1 个答案:

答案 0 :(得分:1)

您的形状必须经过命中测试。即,一种告诉您给定坐标对(用户单击的鼠标坐标)是否在形状内的方法,以便您识别要移动的形状。

通常测试矩形边界框就足够了。如果您想做得更详细,则必须测试 Point in polygon

然后使用鼠标事件移动形状。您还必须跟踪当前状态,即移动或不移动。

鼠标按下事件中,使用命中测试找到被点击的形状。如果有命中,记住这个形状并将状态更改为 moving 并记住形状的第一个点相对于鼠标坐标的偏移量。在移动形状时,您必须保持此偏移不变。这就是鼠标光标粘在形状上的错觉。

鼠标移动事件中,如果状态为moving,请查看当前偏移量与鼠标按下事件中保存的偏移量相差多少。然后通过这种差异调整形状中的每个点。如果状态为 not moving,请不要在鼠标移动中执行任何操作。

mouse up event 中将状态设置为 not moving