如何在.NET中选择可选择的图形绘制线条

时间:2013-06-27 13:38:30

标签: c# .net graphics

绘制线条的简单代码。

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

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

我的问题是如何在运行时选择此行?

4 个答案:

答案 0 :(得分:2)

你需要自己写。

  1. 写一个包装Line
  2. 的类
  3. 向课程添加所有必需的附加行为(当选择行时会发生什么,当线被拉伸,删除,更改颜色时会发生什么......)
  4. 编写一个管理对象的类是否是由鼠标选取的(RayTracer)
  5. 等...

    或者只使用:piccolo2d framework

      

    结构化2D图形框架

答案 1 :(得分:0)

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

Selectable Graphics Object

答案 2 :(得分: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);
            }
        }
    }
}

因为您需要处理所有鼠标事件。

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

答案 3 :(得分:0)

也许有点太晚了,因为你已经接受了答案,但你应该真的考虑WPF。

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

这是您在WPF + MVVM中完成的完整示例。与任何winforms方法相比具有真正的全部优势(例如由于硬件加速而无闪烁)。

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

你真的在GDI中自己重新启动了这一轮。最后,由于闪烁和类似的东西,它将无法使用。