在面板上绘制线条

时间:2015-05-28 07:38:01

标签: c# drawing lines

我尝试制作图片。 当我点击我的标签时,我想画一条线。它有效,它画出了我的线,但最后一点还有另一条线在左上角......我不知道为什么。

(它没用,但是对于另一个项目来说,我试着理解绘图是如何工作的)

这是我的代码:

public partial class Form1 : Form
{
    Pen myPen = new Pen(Color.Blue);
    Graphics g = null;
    int start_x = 0, start_y;
    Point[] points = new Point[1000];
    int test = 0;

    public Form1()
    {
        InitializeComponent();
        start_y = canvas.Height / 2;
        points[0] = new Point (start_x,start_y);
        myPen.Width = 1;
    }

    private void drawLine()
    {

        g.DrawLines(myPen, points);
    }

    private void incrementation_Click(object sender, EventArgs e)
    {
        test = test + 1;
        incrementation.Text = test.ToString();
        if(test == 1)
        {
            points[1] = new Point(100, start_y);
        }
        if (test == 2)
        {
            points[test] = new Point(200, 90),new Point(220, 10);
        }
        if (test == 3)
        {
            points[test] = new Point(220, 10);
            drawLine();
        }

    }

    private void canvas_Paint(object sender, PaintEventArgs e)
    {
        g = canvas.CreateGraphics();
    }
}

2 个答案:

答案 0 :(得分:1)

在构造函数中,您将第一个点填充为

points[0] = new Point (start_x,start_y);

目前,start_x = 0(因为您在声明int start_x = 0后未向其分配任何其他内容)。

然后在incrementation_Click中您分配points[1]points[2]points[3],但您不会在代码中的任何位置进行更改{{1} }。

因此,当您致电points[0]时,第一个点始终为g.DrawLines

除此之外:

  1. 您不需要在(0, canvas.Height / 2)事件处理程序中明确创建图形,因为它可以_Paint进行访问。
  2. 最好将所有画作转移到e.Graphics中:
  3. canvas_Paint

    并且在private void canvas_Paint(object sender, PaintEventArgs e) { e.Graphics.DrawLines(myPen, points); } 处理程序中,而不是调用_Click,您应该只调用drawLine

答案 1 :(得分:1)

有几个问题。

  • 您不会在points[3]之后为点分配任何值。

  • Point是一个结构,所有其他元素的值都为[0,0]

  • 所以你的线路去那里..(所有996个; - )

你应该改变更多:

  • Paint事件中绘制图形或从那里触发它。

  • 请勿存储 Paint e.Grahpics对象。您可以将其传递出去使用它,但不要试着坚持下去。

  • 添加或更改points后,请写canvas.Invalidate()以触发Paint事件。这将使您的绘图持久。

了解持久性绘图最小化&恢复表格!

  • 此外,您应该使用List<Point>而不是数组。这样,您就可以添加Points,而无需决定要支持的Points的数量。

要创建新的Point,您可以这样写:

points.Add(new Point(100, start_y) );

要绘制您,请在Paint event ::

中使用此格式
e.Graphics.DrawLines(myPen, points.toArray());