在面板上画线
本文关键字: | 更新日期: 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)
除此之外:
- 你不需要在
- 最好将所有画作移动到
canvas_Paint
中,如:
_Paint
事件处理程序中显式地创建图形,因为它可以作为e.Graphics
访问。private void canvas_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawLines(myPen, points);
}
和在你的_Click
处理程序,而不是调用drawLine
你应该只调用canvas.Refresh()