3

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

代码:

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

    }

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

4

2 回答 2

9

我发现了这个问题: Efficiently draw a grid in Windows Forms

这是它的要点:

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

相应地定制

于 2012-10-03T14:20:22.403 回答
1

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)
        {
            base.OnPaint(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 控件中绘图几乎从来都不是一个好主意。很多人都这样做,但没有多少专家会这样做。它们并非设计为绘图画布——它们只是继承了所有基于表单的控件所具有的相同功能——它们增加了复杂性并减慢了您的速度,而根本没有添加任何有用的功能。如果您摆脱图片框并直接在保存图片框的表单或面板上绘图,您会更快乐。

于 2018-03-11T02:15:24.367 回答