在PictureBox上绘制网格

我目前正在使用pictureBox。 我很难在画框上画一个大约2 x 2正方形的网格。 现在,下面的代码只给我一条画线。 我怎样才能在pictureBox上绘制一个完整的网格?

码:

private Graphics g1; public Form1() { InitializeComponent(); pictureBox1.Image = new Bitmap(500, 500); g1 = Graphics.FromImage(this.pictureBox1.Image); Pen gridPen = new Pen(Color.Black, 2); g1.DrawLine(gridPen, 0, 0, 100, 100); } 

这就是我想要完成的事情: 在此处输入图像描述

我发现了这个问题: 在Windows窗体中有效地绘制网格

以下是它的要点:

 private void pictureBox1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; int numOfCells = 200; int cellSize = 5; Pen p = new Pen(Color.Black); for (int y = 0; y < numOfCells; ++y) { g.DrawLine(p, 0, y * cellSize, numOfCells * cellSize, y * cellSize); } for (int x = 0; x < numOfCells; ++x) { g.DrawLine(p, x * cellSize, 0, x * cellSize, numOfCells * cellSize); } } 

相应地定制

MikeB接受的答案当然是正确的,但OP仍然很困惑,人们仍然看到这一点,所以我添加一个明确的答案(是的,8年后)。

迈克的方法

 private void pictureBox1_Paint(object sender, PaintEventArgs e) 

是一个需要在正确的时间调用的独立方法。 要实现这一点,您需要使用OnPaint事件调度程序注册它,因此每当发生OnPaint事件时都会调用它。 为此,您可以将以下行放入一些方便的位置,例如在类的构造函数中:

 OnPaint += pictureBox1_Paint; 

这种方法没问题,但如果你到达真正需要绘图性能的地方,它会对你造成伤害,因为要构造并传递给你的PaintEventArgs需要额外的费用。 更好的方法是覆盖父类的OnPaint方法,并将绘图代码直接放在OnPaint方法中。 这样你就不必连接任何事件处理程序,它运行得更快。 代码看起来几乎相同:

 protected override void OnPaint (PaintEventArgs e) { Graphics g = e.Graphics; int numOfCells = 200; int cellSize = 5; Pen p = new Pen(Color.Black); for (int y = 0; y < numOfCells; ++y) { g.DrawLine(p, 0, y * cellSize, numOfCells * cellSize, y * cellSize); } for (int x = 0; x < numOfCells; ++x) { g.DrawLine(p, x * cellSize, 0, x * cellSize, numOfCells * cellSize); } } 

最后一个建议:在PictureBox控件中绘图几乎不是一个好主意。 很多人都这样做,但没有多少专家会这样做。 它们并非设计为绘图canvas - 它们只是inheritance了所有基于表单的控件所具有的相同function - 并且它们增加了复杂性并减慢了速度,而根本没有添加任何有用的function。 如果你摆脱了图片框并且直接在拿着你的图片框的表格或面板上画画,你会更高兴。