将CellPaint事件添加到PictureBox,并在其上绘制网格

时间:2016-11-11 13:17:16

标签: c# picturebox paintevent

我在PictureBox上创建了一个Grid,如下所示:

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

这就是它的样子:
enter image description here

之前我使用过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);
}

我如何将这两者结合起来?

1 个答案:

答案 0 :(得分:1)

除非你的图片框很大,否则我认为它不会太迟钝。 PBox是双缓冲的,应该可以正常工作。

考虑一下:当您的CellPaint事件看起来很小时,确实需要每个单元每个时间,所以完整TLP的表面正在重新时间无效它。所以:与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数据结构..

由您决定如何整合网格线的绘制。最简单的方法是在cellPaint循环之后绘制它们。

通过重新计算单元格大小(以及Invalidating PictureBox),它将很好地resize其内容:

enter image description here