c#拖动绘制线条

时间:2016-07-29 09:52:47

标签: c# winforms user-interface drawing gdi+

如何画一条像油漆一样的线,单击一个固定的第一个点,第二个点(和线)用鼠标移动,另一个点击固定线。

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);
}

点击事件部分很好,但是使用上面的方法,擦除线实际上是白线,与其他背景图像重叠,之前绘制的蓝线重叠。

是否有更易于管理的方法来实现它?感谢

2 个答案:

答案 0 :(得分:1)

不要试图通过在它们上面绘制来擦除线条。如果你绘制到屏幕外的缓冲区并且在每个绘图调用上绘制该位图到控件,你会更好。这样你就可以获得无闪烁的图形和干净的线条,它可以按你想要的方式工作。

请查看this forum post以获得有关如何使用Graphics课程的详细说明,并进行总体绘图。在帖子的最后还有一个很好的示例程序。我建议你在完成说明后查看源代码。

答案 1 :(得分:1)

表单客户端区域上的任何绘图都应在 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();
}