将 CellPaint 事件添加到画有 Grid 的 PictureBox

Add CellPaint event to PictureBox with Grid painted on it

我像这样在 PictureBox 上创建了一个网格:

private void PictureBoxPaint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            int numOfCellsWidth = 50;
            int numOfCellsHeight = 600;
            int cellSize = 20;
            Pen p = new Pen(Color.Black);

            for (int y = 0; y < numOfCellsHeight; ++y)
            {
                g.DrawLine(p, 0, y * cellSize, numOfCellsHeight * cellSize, y * cellSize);                    
            }

            for (int x = 0; x < numOfCellsWidth; ++x)
            {
                g.DrawLine(p, x * cellSize, 0, x * cellSize, numOfCellsHeight * cellSize);
            }
        }

这是它的样子:

我之前使用过 tableLayoutPanel,它有一个 CellPaint 事件,我可以将其绑定到数组列表,以便在更改列表时更改单元格的颜色。这是我的:

private void tableLayoutPanelMainGrid_CellPaint(object sender, TableLayoutCellPaintEventArgs e)
{
    if (mainVisualization.mainGrid != null)
        if (mainVisualization.mainGrid.cellList != null)
            using (var b = new SolidBrush(mainVisualization.mainGrid.cellList[e.Column, e.Row].color))
                e.Graphics.FillRectangle(b, e.CellBounds);
}

如何将这两者结合起来?

除非你的图片框很大,否则我认为它不会有延迟。 PBox 是 double-buffered,应该可以正常工作。

考虑一下:虽然您的 CellPaint 事件 看起来 很小,但实际上需要 each 单元格 each 次,所以你的 TLP 的整个表面被重新绘制 each 次你 invalidated 它。所以:与 PBox 的情况没有太大区别..

这里有一个你自己的例子PaintCellPaint。它使用一个简单的 2d-Color 数组和两个 ints 来存储当前的单元格大小。 重新计算 调整 PictureBox 面板!

Color[,] cellList;
int cellWidth = 23;
int cellHeight = 23;

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    if (cellList == null) InitCells(22, 22);


    for (int c = 0; c < cellList.GetLength(0); c++)
        for (int r = 0; r < cellList.GetLength(1); r++)
        {
            TableLayoutCellPaintEventArgs tep = new 
                TableLayoutCellPaintEventArgs(e.Graphics,
                    Rectangle.Round(e.Graphics.ClipBounds),
                    new Rectangle(c*cellWidth, r*cellHeight, cellWidth, cellHeight), 
                    c, r);
            pictureBox1_CellPaint(e, tep);
        }
    // insert the gridline drawing here:
    for (int c = 0; c <= cellList.GetLength(1); c++)
            e.Graphics.DrawLine(Pens.DarkSlateBlue, 0, c * cellHeight, 
                                cellWidth * cellList.GetLength(0), c * cellHeight);
    for (int c = 0; c <= cellList.GetLength(0); c++)
            e.Graphics.DrawLine(Pens.DarkSlateBlue, c * cellWidth, 0, 
                                c * cellWidth, cellHeight * cellList.GetLength(1));
}

private void pictureBox1_CellPaint(object sender, TableLayoutCellPaintEventArgs e)
{
    //if (mainVisualization.mainGrid != null)
    //    if (mainVisualization.mainGrid.cellList != null)
            using (var b = new SolidBrush(cellList[e.Column, e.Row]))
                e.Graphics.FillRectangle(b, e.CellBounds);
}

您可以看到它是 TLP 代码的直接克隆。不确定你是否真的 应该 那样做,但这是一个如何模拟 CellPaint 事件的例子..

当然你会想要使用你自己的cellList数据结构..

如何集成网格的绘制由您决定lines.The最简单的方法是在cellPaint循环之后绘制它们。

通过重新计算单元格大小(以及 InvalidatingPictureBox)它将 resize 它的内容很好: