0

画线的简单代码。

using (Graphics g = this.CreateGraphics())
        {
            g.DrawLine(Pens.Black, new Point(50, 50), new Point(100, 100));
        }

这将绘制一条典型的线。但是我希望这条线是可选的,以便用户可以在运行时进一步操作它(拉伸、调整大小等)。最初,我尝试使用可以在运行时以线作为背景操作的控件,但是由于控件重叠问题而无法工作。

我的问题是如何在运行时选择这条线?

4

4 回答 4

2

你需要自己写。

  1. 编写一个包装 Line 的类
  2. 将所有需要的附加行为添加到类(选择线条时会发生什么,当线条被拉伸、删除、更改颜色时会发生什么......)
  3. 编写一个管理对象是否被鼠标选中的类(RayTracer)

ETC...

或者干脆使用:piccolo2d框架

结构化二维图形框架

于 2013-06-27T13:42:21.883 回答
0

您必须自己创建它。声明图形对象实现的接口。建议:

public interface IObject
{
    bool HitTest(Point mouseLocation);
    void Paint(Graphics g);
    List<IAdorner> Adorners { get; }
}

public interface IAdorner
{
    bool HitTest(Point mouseLocation);
    void Paint(Graphics g);

    void StartMoving(Point mouseLocation);
    void Move(Point mouseLocation);
}

例如,装饰器是线条对象的可选端点。

您的主要绘画程序将如下所示:

private void drawingSurface_Paintobject sender, PaintEventArgs e)
{
    foreach (IObject o in _objects) {
        o.Paint(e.Graphics);
        if (o == _selectedObject) {
            foreach (IAdorner a in o.Adorners) {
                a.Paint(e.Graphics);
            }
        }
    }
}

当然,您需要所有鼠标事件处理。

这些接口足够抽象,可以实现任何形状。例如,它们不包含任何坐标,因为不同类型的对象需要不同数量和种类的坐标和参数。

于 2013-06-27T14:01:00.467 回答
0

也许这有点太晚了,因为您已经接受了答案,但是您应该为此考虑 WPF。

https://stackoverflow.com/a/15469477/643085

这是您在 WPF + MVVM 中所追求的精确示例。与任何 winforms 方法相比具有真正的全部优势(例如由于硬件加速而不会闪烁)。

请至少试一试。完整的 CSProj 项目源可用。

您真的在重新设计自己在 GDI 中实现这一切的轮子。最后,由于闪烁和类似的东西,它将无法使用。

于 2013-06-29T02:45:07.723 回答
0

我认为您想要做的是使 Graphics 对象可选择?如果是这样,您可以将您的逻辑放入 MouseOver 和 MouseButton 事件中。看看这个,它可能会给你一些见解。

可选图形对象

于 2013-06-27T13:42:22.420 回答