我正在尝试创建一个可以指定 with 或 height 的网格(即 10 框宽 x 20 高)。我已经创建了一个创建网格的脚本,但我想以一种可以创建不同宽度和高度的方式来创建它。
它当前创建一个宽度与高度相等的网格,并且不显示坐标。
int numOfCells = 5;
int cellSize = 80;
Pen p = new Pen(Color.Black);
for (int y = 0; y < numOfCells; y++)
{
graphics.DrawLine(p, 0, y * cellSize, numOfCells * cellSize, y * cellSize);
for (int x = 0; x < numOfCells; x++)
{
graphics.DrawLine(p, x * cellSize, 0, x * cellSize, numOfCells * cellSize);
}
}
结果如下:
我想要实现的是一个像这样的网格,它可以有不同的宽度和高度,还可以显示框内的坐标:
答案 0 :(得分:2)
使用传递给其构造函数的参数生成网格的可定制/可扩展类的示例。
该类还包含用于在设备上下文中绘制网格的方法(Graphics
事件提供的 PaintEventArgs
参数的 Paint
对象/OnPaint
控件的方法)。
作为基本实现,它允许指定在其单元格内绘制的文本的字体和颜色。
您可以添加更多属性,例如定义网格线的颜色和粗细。
► 在图形示例中,您可以看到三个 TextBox 控件(txtRows
、txtColumns
和 txtCellSize
)用于输入行数和列数以及单元格大小。
当 Button 被按下 (btnDrawGrid
) 时,如果 TextBoxes 的内容被正确解析,则会生成一个新的 Grid 对象并使用 Control 来呈现 Grid(这里是一个名为 {{1 }}) 被重新绘制,调用其 gridCanvas
方法,该方法引发其 Invalidate()
事件。
在Paint事件中,调用当前Paint
类实例的公共DrawGrid()
方法,传递canvas控件的DrawingGrid
对象。< /p>
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
包含创建 List<GridCell>
时生成的所有网格单元 - 使用传递给类构造函数的值 - 调用私有 DrawingGrid
方法。
生成的单元格列表由 BuildGrid()
类的 public readonly Grid
属性公开。
DrawingGrid
属性默认为 Font
,SystemInformation.MenuFont
属性默认为 TextColor
。
这两个属性的值可以随时更改。
► 定义网格的 Color.DimGray
对象集合是使用 Graphics.DrawRectangles() 方法绘制的。
► 使用TextRenderer.DrawText()绘制每个单元格(每个矩形)的文本。
设置其 TextFormatFlags 选项,文本在单元格内垂直和水平居中 (RectangleF
),并删除文本默认填充 (TextFormatFlags.VerticalCenter | TextFormatFlags.HorizontalCenter
)。
TextFormatFlags.NoPadding