C#拖动绘制线条

3

如何像Windows画图一样绘制一条直线,单击以固定第一个点,第二个点(和线)随鼠标移动,再次单击以固定直线。

int x = 0, y = 0;
protected override void OnMouseMove(MouseEventArgs e)
{
    base.OnMouseMove(e);
    // Create the graphics object
    Graphics g = CreateGraphics();
    // Create the pen that will draw the line
    Pen p = new Pen(Color.Navy);
    // Create the pen that will erase the line
    Pen erase = new Pen(Color.White);
    g.DrawLine(erase, 0, 0, x, y);
    // Save the mouse coordinates
    x = e.X; y = e.Y;
    g.DrawLine(p, 0, 0, x, y);
}

点击事件部分没问题,但使用上述方法擦除线条实际上是白色线条,这会重叠在其他背景图像和之前绘制的蓝色线条上。

有没有更易于管理的方法来实现它?谢谢


你想要在之后保存生成的图像吗? - Takarii
2个回答

2
任何在表单客户区上的绘图都应该在OnPaint事件中实现,以避免任何奇怪的效果。 请考虑以下代码片段:
Point Latest { get; set; }

List<Point> _points = new List<Point>(); 

protected override void OnMouseMove(MouseEventArgs e)
{
    base.OnMouseMove(e);

    // Save the mouse coordinates
    Latest = new Point(e.X, e.Y);

    // Force to invalidate the form client area and immediately redraw itself. 
    Refresh();
}

protected override void OnPaint(PaintEventArgs e)
{
    var g = e.Graphics;
    base.OnPaint(e);

    if (_points.Count > 0)
    {
        var pen = new Pen(Color.Navy);
        var pt = _points[0];
        for(var i=1; _points.Count > i; i++)
        {
            var next = _points[i];
            g.DrawLine(pen, pt, next);
            pt = next;
        }

        g.DrawLine(pen, pt, Latest);
    }
}

private void Form1_MouseClick(object sender, MouseEventArgs e)
{
    Latest = new Point(e.X, e.Y);
    _points.Add(Latest);
    Refresh();
}

谢谢,我刚刚尝试了一下。它非常简洁,但是使用Refresh方法后会清除之前的行。一旦我开始新的行绘制,之前的行就会消失。有没有办法保留所有之前的行? - tomu
然后,您可以将**OnClick()事件中的所有先前点保存在一个列表中,并从OnPaint()**中绘制它们。 - Jackdaw
请查看上面答案中的更新代码片段。 - Jackdaw
1
为了消除闪烁效果,需要将窗体的DoubleBuffered属性设置为True - Jackdaw
这个OnPaint是什么?当我查看事件,比如在一个窗体上时,我看到它被调用,比如Form1_Paint。 - barlop
@barlop:**OnPaint()**是Form类的可重写方法。根据描述,它会触发_Paint_事件。Visual Studio表单设计器只是帮助你添加_Paint_事件处理程序。因此,你可以使用任何这些选项。 - Jackdaw

1
不要试图通过在其上绘制来擦除线条。如果您将绘图到屏幕外缓冲区,并在每次绘制调用时将该位图绘制到控件上,则效果会更好。这样,您就可以获得无闪烁的图形和一个完美符合您要求的清晰线条。
请查看此论坛帖子,了解如何使用Graphics类进行绘图以及绘图的一般方法的详细说明。帖子末尾还有一个很好的示例程序。我建议您在阅读说明后查看该源代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接