【问题标题】:Select and Move shape Objects [duplicate]选择和移动形状对象[重复]
【发布时间】:2021-08-05 11:28:36
【问题描述】:

目前,我正在开发一个基于 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();
    }
}

【问题讨论】:

  • “但没有用” 不足以描述您遇到的问题。你需要帮助哪一部分?你想在这里手动做多少?这是关于命中测试吗? (确定一个点是否在一个形状中?)这是关于鼠标交互的吗?这是关于绘画和绘画的吗?跟踪选择状态?有什么问题?

标签: c# winforms


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 请注意,GraphicsPath 的IsVisbleIsOutlineVisble 方法大大简化了确定点是否包含在多边形中或接触其边界的任务。它还简化了形状的选择,使用标准的ClickCTRL+Click 来选择完全被另一个形状遮挡的形状。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 2016-06-30
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
  • 1970-01-01
相关资源
最近更新 更多