C# 选择并移动形状对象

C# 选择并移动形状对象,c#,winforms,C#,Winforms,目前,我正在开发一个基于Windows窗体的简单绘图应用程序。我需要一个方法,可以让我选择当前对象并移动它。 它基于点绘制形状,例如三角形类,并将其存储在列表中: using System.Drawing; namespace DrawingApplication { class Triangle : Shape { string label; int triangleIndex; Point[] pnt = new Point[3];

目前,我正在开发一个基于Windows窗体的简单绘图应用程序。我需要一个方法,可以让我选择当前对象并移动它。 它基于点绘制形状,例如三角形类,并将其存储在列表中:

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

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

通常,测试矩形边界框就足够了。如果你想做得更详细,那么你必须测试一个测试

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

在鼠标按下事件中,使用点击测试查找单击的形状。如果命中,请记住此形状并将状态更改为移动,并记住形状的第一个点相对于鼠标坐标的偏移量。移动形状时,必须保持此偏移恒定。这就是为什么会出现鼠标光标粘在形状上的错觉

鼠标移动事件中,如果状态为
移动
,请查看当前偏移量与鼠标下移事件中保存的偏移量的差异。然后根据此差异调整形状中的每个点。如果状态为
不移动
请不要在鼠标移动中执行任何操作


鼠标向上移动事件中将状态设置为
不移动

“但是没有用”并不能充分描述您遇到的问题。你需要帮助做什么?您想在此处手动执行多少操作?这是关于命中测试的吗?(确定点是否在形状中?)这是关于鼠标交互的吗?这是关于绘画和绘画的吗?跟踪选择状态?问题是什么?请注意,GraphicsPath和方法简化了许多确定点是否包含在多边形中或是否接触其边界的任务,这可能很有用。它还简化了形状的选择,可以使用标准的
单击
按住CTRL键并单击
,来选择被另一个形状完全遮挡的形状。