使用传递给其构造函数的参数生成网格的可自定义/可扩展类的示例。
该类还包含用于在设备上下文中绘制网格的方法(Paint 事件提供的 PaintEventArgs 参数的 Graphics 对象 / OnPaint strong> 控件的方法)。
作为基本实现,它允许指定在其单元格内绘制的文本的字体和颜色。
您可以添加更多属性,例如,定义网格线的颜色和粗细。
▶ 在图形示例中,您可以看到三个 TextBox 控件(txtRows、txtColumns 和 txtCellSize)用于输入行数和列数以及单元格大小。
当 Button 被按下时(btnDrawGrid),如果 TextBoxes 的内容解析正确,就会生成一个新的 Grid 对象和用来呈现 Grid 的 Control(这里是一个名为 gridCanvas 的 PictureBox Control strong>) 被重新绘制,调用其Invalidate() 方法,该方法引发其Paint 事件。
在Paint事件中,调用当前DrawingGrid类实例的公共DrawGrid()方法,传递canvas控件的Graphics对象。
private DrawingGrid drawingGrid = null;
private void btnDrawGrid_Click(object sender, EventArgs e)
{
if (!int.TryParse(txtRows.Text, out int gridRows)) return;
if (!int.TryParse(txtColumns.Text, out int gridColumns)) return;
if (!float.TryParse(txtCellSize.Text, out float cellSize)) return;
drawingGrid = new DrawingGrid(gridRows, gridColumns, cellSize);
gridCanvas.Invalidate();
}
private void gridCanvas_Paint(object sender, PaintEventArgs e)
{
if (drawingGrid == null) return;
drawingGrid.DrawGrid(e.Graphics);
}
DrawingGrid 类:
此类使用嵌套的公共类 GridCell 来定义 Grid 的每个单元格。
List<GridCell> 包含创建 DrawingGrid 时生成的所有网格单元 - 使用传递给类 Constructor 的值 - 调用私有 BuildGrid() 方法。
生成的单元格列表由DrawingGrid 类的public readonly Grid 属性公开。
Font 属性默认为 SystemInformation.MenuFont,TextColor 属性默认为 Color.DimGray。
这两个属性的值可以随时更改。
▶ 定义 Grid 的 RectangleF 对象的集合是使用 Graphics.DrawRectangles() 方法绘制的。
▶ 每个单元格(每个矩形)的文本是使用TextRenderer.DrawText() 绘制的。
设置其TextFormatFlags 选项,文本在单元格内垂直和水平居中 (TextFormatFlags.VerticalCenter | TextFormatFlags.HorizontalCenter) 并删除文本默认填充 (TextFormatFlags.NoPadding)。
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
public class DrawingGrid
{
private TextFormatFlags flags = TextFormatFlags.VerticalCenter |
TextFormatFlags.HorizontalCenter | TextFormatFlags.NoPadding;
public DrawingGrid(int rows, int columns, float cellSize)
{
this.Grid = new List<GridCell>(rows * columns);
BuildGrid(rows, columns, cellSize);
}
public List<GridCell> Grid { get; }
public Font Font { get; set; } = SystemInformation.MenuFont;
public Color TextColor { get; set; } = Color.DimGray;
private void BuildGrid(int rows, int columns, float size)
{
for (int c = 0; c < columns; c++) {
for (int r = 0; r < rows; r++) {
Grid.Add(new GridCell(new RectangleF(c * size, r * size, size, size), $"{r},{c}"));
}
}
}
public void DrawGrid(Graphics g)
{
g.DrawRectangles(Pens.Black, Grid.Select(gc => gc.Cell).ToArray());
foreach (var item in Grid) {
TextRenderer.DrawText(g, item.Text, Font, Rectangle.Round(item.Cell), TextColor, flags);
}
}
public class GridCell {
public GridCell(RectangleF cellBounds, string text) {
this.Cell = cellBounds;
this.Text = text;
}
public RectangleF Cell { get; }
public string Text { get; }
}
}