我尝试制作图片。 当我点击我的标签时,我想画一条线。它有效,它画出了我的线,但最后一点还有另一条线在左上角......我不知道为什么。
(它没用,但是对于另一个项目来说,我试着理解绘图是如何工作的)
这是我的代码:
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();
}
}
答案 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
除此之外:
(0, canvas.Height / 2)
事件处理程序中明确创建图形,因为它可以_Paint
进行访问。e.Graphics
中:
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());