C# 在面板上画线

C# 在面板上画线,c#,drawing,lines,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 =

我试着做一个图形。 当我点击标签时,我想画一条线。它起作用了,它画出了我的线,但在最后一点,在左上角有另一条线。。我不知道为什么

(这没用,但这是为了另一个项目,我试着理解图纸的工作原理)

这是我的密码:

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

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

points[0] = new Point (start_x,start_y);
此时,
start\u x=0
(因为在声明
int start\u x=0
之后,您没有为它分配任何其他内容)

然后在
增量中单击
您正在分配
点[1]
点[2]
点[3]
,但您不会更改代码中的任何位置
点[0]

因此,当您调用
g.DrawLines
-第一个点总是
(0,canvas.Height/2)

除此之外:

  • 您不需要在
    \u Paint
    事件处理程序中显式创建图形,因为它可以作为
    e.graphics
    访问
  • 最好将所有绘画移到
    canvas\u Paint
    中,如:
  • \u中单击
    处理程序,而不是调用
    drawLine
    ,您应该只调用
    canvas.Refresh()
    几个问题

    • 点[3]
      之后,您不会为点指定任何值

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

    • 所以你的台词就在那里。。(全部996人;-)

    您还需要更改更多内容:

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

    • 不要存储
      绘制e.Grahpics
      对象。你可以把它分发出去使用,但不要试图抓住它

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

    要了解持久绘图,请最小化并还原表单

    • 您还应该使用
      列表
      ,而不是数组。这使您可以添加
      ,而无需决定要支持的
      点的数量
    要创建一个新的
    ,可以编写如下代码:

    points.Add(new Point(100, start_y) );
    
    要绘制,请在
    绘制
    事件中使用此格式:

    e.Graphics.DrawLines(myPen, points.toArray());
    

    谢谢,这是因为我所有的数组都是[0,0],但我没有列出点。它给我画了一个红十字
    e.Graphics.DrawLines(myPen, points.toArray());