带坐标的平铺网格

时间:2021-03-07 21:16:07

标签: c# winforms graphics

我正在尝试创建一个可以指定 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);
    }
}

结果如下:

enter image description here

我想要实现的是一个像这样的网格,它可以有不同的宽度和高度,还可以显示框内的坐标:

enter image description here

1 个答案:

答案 0 :(得分:2)

使用传递给其构造函数的参数生成网格的可定制/可扩展类的示例。
该类还包含用于在设备上下文中绘制网格的方法(Graphics 事件提供的 PaintEventArgs 参数的 Paint 对象/OnPaint 控件的方法)。
作为基本实现,它允许指定在其单元格内绘制的文本的字体和颜色。
您可以添加更多属性,例如定义网格线的颜色和粗细。

► 在图形示例中,您可以看到三个 TextBox 控件(txtRowstxtColumnstxtCellSize)用于输入行数和列数以及单元格大小。
当 Button 被按下 (btnDrawGrid) 时,如果 TextBoxes 的内容被正确解析,则会生成一个新的 Grid 对象并使用 Control 来呈现 Grid(这里是一个名为 {{1 }}) 被重新绘制,调用其 gridCanvas 方法,该方法引发其 Invalidate() 事件。

在Paint事件中,调用当前Paint类实例的公共DrawGrid()方法,传递canvas控件的DrawingGrid对象。< /p>

Graphics

Drawing Grid

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 属性默认为 FontSystemInformation.MenuFont 属性默认为 TextColor
这两个属性的值可以随时更改。

► 定义网格的 Color.DimGray 对象集合是使用 Graphics.DrawRectangles() 方法绘制的。

► 使用TextRenderer.DrawText()绘制每个单元格(每个矩形)的文本。
设置其 TextFormatFlags 选项,文本在单元格内垂直和水平居中 (RectangleF),并删除文本默认填充 (TextFormatFlags.VerticalCenter | TextFormatFlags.HorizontalCenter)。

TextFormatFlags.NoPadding