将 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 的情况没有太大区别..
这里有一个你自己的例子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
数据结构..
如何集成网格的绘制由您决定lines.The最简单的方法是在cellPaint
循环之后绘制它们。
通过重新计算单元格大小(以及 Invalidating
和 PictureBox
)它将 resize
它的内容很好:
我像这样在 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 的情况没有太大区别..
这里有一个你自己的例子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
数据结构..
如何集成网格的绘制由您决定lines.The最简单的方法是在cellPaint
循环之后绘制它们。
通过重新计算单元格大小(以及 Invalidating
和 PictureBox
)它将 resize
它的内容很好: