目前,我正在开发一个基于 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();
}
}
答案 0 :(得分:1)
您的形状必须经过命中测试。即,一种告诉您给定坐标对(用户单击的鼠标坐标)是否在形状内的方法,以便您识别要移动的形状。
通常测试矩形边界框就足够了。如果您想做得更详细,则必须测试 Point in polygon。
然后使用鼠标事件移动形状。您还必须跟踪当前状态,即移动或不移动。
在鼠标按下事件中,使用命中测试找到被点击的形状。如果有命中,记住这个形状并将状态更改为 moving
并记住形状的第一个点相对于鼠标坐标的偏移量。在移动形状时,您必须保持此偏移不变。这就是鼠标光标粘在形状上的错觉。
在鼠标移动事件中,如果状态为moving
,请查看当前偏移量与鼠标按下事件中保存的偏移量相差多少。然后通过这种差异调整形状中的每个点。如果状态为 not moving
,请不要在鼠标移动中执行任何操作。
在 mouse up event 中将状态设置为 not moving
。