在面板上画线

本文关键字: | 更新日期: 2023-09-27 17:51:01

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

(这是无用的,但它是为另一个项目,我试图了解如何工作的图纸)

下面是我的代码:

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

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

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)

除此之外:

    你不需要在_Paint事件处理程序中显式地创建图形,因为它可以作为e.Graphics访问。
  1. 最好将所有画作移动到canvas_Paint中,如:

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

和在你的_Click处理程序,而不是调用drawLine你应该只调用canvas.Refresh()

相关文章:
  • 没有找到相关文章