我在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);
}
}
之前我使用过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);
}
我如何将这两者结合起来?
答案 0 :(得分:1)
除非你的图片框很大,否则我认为它不会太迟钝。 PBox是双缓冲的,应该可以正常工作。
考虑一下:当您的CellPaint
事件看起来很小时,确实需要每个单元每个时间,所以完整TLP的表面正在重新每时间无效它。所以:与PBox的情况没什么不同。
以下是您自己的Paint
和CellPaint
的示例。它使用一个简单的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
其内容: