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