【问题标题】:c# draw lines with draggingc# 用拖动画线
【发布时间】:2016-07-29 09:52:46
【问题描述】:

如何像windows Paint一样画一条线,单击固定第一个点,第二个点(和线)用鼠标移动,再单击一次固定线。

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

点击事件部分没问题,但是上面这个方法,擦除线其实是白线,和其他背景图重叠,之前绘制的蓝线。

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

【问题讨论】:

  • 您想保存生成的图像吗?

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


【解决方案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();
}

【讨论】:

  • 谢谢,我刚试过。它非常简洁,但是使用 Refresh 方法时,它不会保留以前的行。一旦我开始绘制新的线条,之前的线条就会消失。有没有办法保留所有以前的行?
  • 然后您可以将 OnClick() 事件中的所有先前点保存在列表中,然后从 OnPaint() 中进行绘制。跨度>
  • 请在答案中查看上面更新的代码片段。
  • 为了消除闪烁效果,需要将表单上的 DoubleBuffered 属性设置为 True
  • 这是什么 OnPaint?当我查看事件时,例如在表格上,我看到它被称为例如Form1_Paint
【解决方案2】:

不要试图通过在它们上面画线来擦除它们。如果您绘制到屏幕外缓冲区并在每次绘制调用时将该位图绘制到控件,您会更好。这样,您将获得无闪烁的图形和清晰的线条,按照您想要的方式工作。

查看this forum post,了解如何使用Graphics 类并进行一般绘图。文章末尾还有一个很好的示例程序。我建议您在阅读说明后查看该源代码。

【讨论】:

    猜你喜欢
    • 2019-04-06
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多