如何绘制可选线?

时间:2010-08-29 23:47:35

标签: c# graphics gdi

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

提前致谢


我设法使用硬编码矩形。但我仍然不知道如何使用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();
    }

2 个答案:

答案 0 :(得分:2)

你可以从简单的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();
    }
}

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

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

答案 1 :(得分:0)

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

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

对于拖放操作,你必须通过根据鼠标移动改变对象的坐标来做类似的事情。