在面板上画线
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)
除此之外:
- 您不需要在
_Paint
事件处理程序中显式创建图形,因为它可以作为 e.Graphics
. 访问
- 最好把所有的画都搬进
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());
我尝试做一个图形。 当我点击我的标签时,我想画一条线。它有效,它画出了我的线,但在最后一点左上角还有另一条线。我不知道为什么。
(没用,不过是给别的项目用的,我试着看下画的原理)
这是我的代码:
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)
除此之外:
- 您不需要在
_Paint
事件处理程序中显式创建图形,因为它可以作为e.Graphics
. 访问
- 最好把所有的画都搬进
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());