可定制/可扩展类的示例,它使用传递给其构造函数的参数生成网格。
该类还包含用于在设备上下文中绘制网格的方法(Graphics
的对象PaintEventArgs
提供的论据Paint
事件 /OnPaint
控制方法)。
作为基本实现,它允许指定在其单元格内绘制的文本的字体和颜色。
您可以添加更多属性,例如定义网格线的颜色和粗细。
▶ 在图形示例中,您可以看到三个 TextBox 控件(txtRows
, txtColumns
and txtCellSize
)用于输入行数和列数以及单元格大小。
当按下按钮时 (btnDrawGrid
),如果正确解析了 TextBoxes 的内容,则会生成一个新的 Grid 对象,并使用 Control 来呈现该 Grid(这里是一个名为 PictureBox Control)gridCanvas
)被重新绘制,调用它的Invalidate()
方法,这提高了其Paint
event.
在绘画活动中,公众DrawGrid()
当前的方法DrawingGrid
调用类实例,传递Graphics
的对象canvas控制。
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);
}
The DrawingGrid
class:
该类使用嵌套的公共类,GridCell
,定义网格的每个单元格。
AList<GridCell>
包含创建时生成的所有网格单元DrawingGrid
创建 - 使用传递给类构造函数的值 - 调用私有BuildGrid()
method.
生成的单元格列表由public readonly Grid
的财产DrawingGrid
class.
The Font
属性默认为SystemInformation.MenuFont
和TextColor
财产给Color.DimGray
.
这两个属性的值可以随时更改。
▶ 收集RectangleF
定义网格的对象是使用Graphics.DrawRectangles() method.
▶ 每个单元格(每个矩形)的文本是使用以下命令绘制的TextRenderer.DrawText().
设置其文本格式标志选项,文本在单元格内垂直和水平居中(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; }
}
}