【问题标题】:Tile Grid with Coordinates带坐标的平铺网格
【发布时间】:2021-03-07 21:16:07
【问题描述】:

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

结果如下:

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

【问题讨论】:

    标签: c# winforms graphics gdi+


    【解决方案1】:

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

    ▶ 在图形示例中,您可以看到三个 TextBox 控件(txtRowstxtColumnstxtCellSize)用于输入行数和列数以及单元格大小。
    当 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&lt;GridCell&gt; 包含创建 DrawingGrid 时生成的所有网格单元 - 使用传递给类 Constructor 的值 - 调用私有 BuildGrid() 方法。

    生成的单元格列表由DrawingGrid 类的public readonly Grid 属性公开。
    Font 属性默认为 SystemInformation.MenuFontTextColor 属性默认为 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; }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      • 2014-07-02
      • 2018-03-12
      • 1970-01-01
      相关资源
      最近更新 更多