在面板上画线

Drawing lines on a panel

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

(没用,不过是给别的项目用的,我试着看下画的原理)

这是我的代码:

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_x = 0(因为在声明 int start_x = 0 之后您没有分配任何其他内容)。

然后在 incrementation_Click 中,您分配了 points[1]points[2]points[3],但您没有更改代码中的任何地方 points[0]

所以当你调用 g.DrawLines - 第一个点总是 (0, canvas.Height / 2)

除此之外:

  1. 您不需要在 _Paint 事件处理程序中显式创建图形,因为它可以作为 e.Graphics.
  2. 访问
  3. 最好把所有的画都搬进canvas_Paint像:

private void canvas_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.DrawLines(myPen, points);
}

并且在您的 _Click 处理程序中而不是调用 drawLine 您应该只调用 canvas.Refresh()

几个问题。

  • 您没有为 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事件中使用这个格式::

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