【问题标题】:How to draw a selectable line?如何画一条可选择的线?
【发布时间】:2011-04-05 13:17:40
【问题描述】:

我想创建一个用户能够操纵他画的线的应用程序。像删除线或选择它。我该怎么做?

提前致谢


我设法使用硬编码矩形来做到这一点。但是我仍然不知道如何使用drawLine() 来做我可以使用drawPath 来做命中测试吗?

代码如下:

private bool selectGraph = false;
private Rectangle myrec = new Rectangle(50, 50, 100, 100);
private Graphics g;

private void panel1_Paint(object sender, PaintEventArgs e)
    {
        SolidBrush sb = new SolidBrush(Color.Blue);
        Pen p = new Pen(Color.Blue, 5);

        e.Graphics.DrawRectangle(p, myrec);
        e.Graphics.FillRectangle(sb, myrec);
    }

    private void panel1_MouseUp(object sender, MouseEventArgs e)
    {
        Point mPT = new Point(e.X, e.Y);

        if (e.Button == MouseButtons.Left)
        {
            if (myrec.Contains(mPT))
            {
                selectGraph = true;
                button1.Enabled = true;
            }
            else
            {
                selectGraph = false;
                button1.Enabled = false;
            }
        }
        Invalidate();
    }

【问题讨论】:

  • 废话有一个visualbasic powerpack工具。
  • 拜托,噢拜托,摆脱g = panel1.CreateGraphics();这一行!您已经在 Paint 事件处理程序中。 PaintEventArgs 有一个名为 Graphics 的属性,您可以使用它来绘制。如果您使用当前的方式,您的应用程序将会很慢并且非常有问题。 :)
  • @TheClodlessSky 是的,我已经消除了这种方法!我对 GDI 有点陌生,这就是为什么大声笑。谢谢 TCS :)

标签: c# graphics gdi


【解决方案1】:

你可以从一个简单的Line 类开始:

public class Line
{
    public Point Start { get; set; }
    public Point End { get; set; }
}

然后你可以有你的表格:

private Line Line = new Line();

protected override void OnPaint(PaintEventArgs e)
{
    e.Graphics.DrawLine(Pens.Red, this.Line.Start, this.Line.End);
}

protected override void OnMouseMove(MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        this.Line.Start = e.Location;
        this.Refresh();
    }
    else if (e.Button == MouseButtons.Right)
    {
        this.Line.End = e.Location;
        this.Refresh();
    }
}

所以基本上他们可以删除this.Line 可能在“MiddleButton”点击或其他东西上。这应该足以让您入门。

我有 created a sample,它显示了如何做到这一点。设置一些断点,看看事情是如何完成的。

【讨论】:

  • 这是鼠标移动事件。我想要的是,当线条已经在绘制事件上时,我可以拖动、选择和删除它。类似于 Visual Studio 用户控件的拖放。例如,当用户添加一个按钮时,他可以在表单中移动它。
  • @Rye - 好的,但是我为您提供的内容是您入门的基础。按下按钮时,“拖动”基本上是“鼠标移动”。如果要拖动来移动线条,则需要同时偏移Start 和End 点。如果你想“删除”它,你可以将 Line 设置为 NULL。
  • 是的,但我的主要问题是选择线路。
  • @Rye - you 必须实现行的选择。例如,“OnClick”可以采用e.Location 并查看它是否在该线的 10px 内,如果是“则选择该线”(您可以在 Line 对象上设置 Selected=true),然后重绘。 OnPaint 可以说是 if Line is selected, draw it red, otherwise, black。这应该足以让您入门。
  • 啊,这意味着它可以使用图形对象位置进行点击。好主意。
【解决方案2】:

对此没有简单的单行解决方案。你必须自己编程。

您必须跟踪您绘制的每个对象。在 onmousedown 事件中,您必须通过比较坐标来确定鼠标是否已单击或靠近要移动/删除的对象。然后,您需要绘制一些视觉指南,表明该行已“选中”。通过从集合中删除对象,现在删除变得非常容易。

对于拖放,您必须通过根据鼠标移动更改对象的坐标来执行类似的操作。

【讨论】:

  • 你知道一些我可以参考的链接吗?
猜你喜欢
  • 1970-01-01
  • 2021-06-18
  • 2016-07-08
  • 1970-01-01
  • 2012-12-31
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多