带坐标的平铺网格

2023-12-11

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


可定制/可扩展类的示例,它使用传递给其构造函数的参数生成网格。
该类还包含用于在设备上下文中绘制网格的方法(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);
}

Drawing Grid

The DrawingGrid class:

该类使用嵌套的公共类,GridCell,定义网格的每个单元格。 AList<GridCell>包含创建时生成的所有网格单元DrawingGrid创建 - 使用传递给类构造函数的值 - 调用私有BuildGrid() method.

生成的单元格列表由public readonly Grid的财产DrawingGrid class.
The Font属性默认为SystemInformation.MenuFontTextColor财产给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; }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带坐标的平铺网格 的相关文章

  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 为什么“斜接”关节比其他关节慢?

    我在 Flash Player 中绘制线条时遇到图形问题 如果我使用任何其他线条 则以不同粗细绘制在彼此顶部的两条线条无法正确对齐JointStyle than MITER 有关效果图片以及问题的图形部分 请参阅我的帖子在 doctype
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • C# Dns.GetHostEntry 不返回连接到 WiFi 的移动设备的名称

    我有一个 C 中的 Windows 窗体应用程序 我试图获取列表中所有客户端的主机名 下面给出的是 ra00l 来自此链接的代码示例 GetHostEntry 非常慢 https stackoverflow com questions 99
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • 用于 C# 的 TripleDES IV?

    所以当我说这样的话 TripleDES tripledes TripleDES Create Rfc2898DeriveBytes pdb new Rfc2898DeriveBytes password plain tripledes Ke
  • Process.Start() 方法在什么情况下返回 false?

    From MSDN https msdn microsoft com en us library e8zac0ca v vs 110 aspx 返回值 true 表示有新的进程资源 开始了 如果由 FileName 成员指定的进程资源 St
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable

随机推荐

  • 如何使用__malloc_hook?

    In GNU C 库参考手册 有一个示例程序 p 65 但我不知道这三句话是什么 malloc hook old malloc hook old malloc hook malloc hook malloc hook my malloc h
  • 从看似相同的计算中获得不同的输出

    谁能告诉我为什么第 9 行和第 11 行的计算看似相同 但会产生两个不同的输出 我知道差异不是很大 但我使用这些值通过 OpenGL 绘制线条 差异很明显 include
  • 计算 128 位整数中前导零的数量

    如何计算 128 位整数中前导零的数量 uint128 t 有效率的 我知道GCC的内置函数 builtin clz builtin clzl builtin clzll builtin ffs builtin ffsl builtin f
  • 如何使用聚合物将 HTML 注入模板

    我正在使用polymer jsonp 执行 JSONP 请求 但响应有时包含 html 例如 假设 post content 是 strong Foo strong bar 我怎样才能显示 post content 这样 Foo 是粗体吗
  • 如何将字符串放入矩形内?

    我正在尝试将一些字符串 图像和表格添加到我的 pdf 文件中 必须有几页 但是当我尝试使用ColumnText 我使用这个是因为我想将字符串放置在绝对位置 我遇到了一个问题 当列高不足以添加字符串内容时 内容不完整 如何避免内容丢失 这是相
  • 比较一个字符串与几个不同的字符串

    我想将一个字符串与多个字符串进行比较 在 C 中这是如何完成的 如果你想检查一个字符串是否包含在字符串列表中 你可以使用Contains扩展方法 bool isStringContainedInList new string1 string
  • HttpServletRequest getLocale 返回操作系统区域设置而不是浏览器区域设置

    我正在使用 vaadin 框架 在我的应用程序中我有 Override public void onRequestStart HttpServletRequest request HttpServletResponse response c
  • 如何使用 shell 脚本将 HiveQL 查询的结果输出到 CSV?

    我想运行多个 Hive 查询 最好是并行而不是顺序运行 并将每个查询的输出存储到 csv 文件中 例如 query1输出在csv1 query2输出在csv2等等 我会在下班后运行这些查询 目标是在下一个工作日分析输出 我对使用 bash
  • 如何解决 Pandas 中的错误“远程过程调用协议流中传入的表格数据流不正确”

    我有一个 pandas 数据框 正在将其写入 SQL Server 中的表中 数据框包含以下数据类型 Contact ID object Skill No float64 Skill Name object Campaign No floa
  • 什么是“不完全构造的对象”?

    Goetz s Java 并发实践 第 41 页 提到如何this引用可以在构造过程中逃逸 一个 不要这样做 的例子 public class ThisEscape public ThisEscape EventSource source
  • 正则表达式仅匹配整数

    正如标题所述 我正在尝试构建一个正则表达式来从字符串中提取整数 实际情况是 我有一个非常大的代码文件 整数 和一些值 小数 我可以成功提取小数 d d 这可能看起来很奇怪 但我也捕获了 1 或 1 但是我无法提取整数 直到现在我有类似的东西
  • 为什么在 Java 中循环内声明似乎比循环外声明更快?

    当我检查这个时Question不敢相信 所以我测试了一下 似乎是真的 循环内声明似乎比循环外声明更快 有人可以解释这是为什么吗 这是我的测试代码 public class CycleTest param args the command l
  • 如何将 sys.stdout 复制到日志文件?

    编辑 因为看起来要么没有解决方案 要么我正在做一些非常不标准的事情以至于没有人知道 我将修改我的问题以询问 当 python 应用程序正在制作时完成日志记录的最佳方法是什么很多系统调用 我的应用程序有两种模式 在交互模式下 我希望所有输出都
  • JavaScript - 获取浏览器高度

    我正在寻找一个代码片段来获取浏览器窗口中可视区域的高度 我有这段代码 但是它有些问题 好像主体没有超过窗口的高度 然后它会变短 document body clientHeight 我尝试了其他一些方法 但它们要么返回 NaN 要么返回与上
  • 如何解绑和重新绑定

    archive click function event do something archive2 unbind click event 我有这个点击功能 我取消了绑定 但是 当我单击某个按钮时 我想再次绑定它 archive bind
  • 如何设置 SQL Server 2005 作业 CmdExec 超时

    我在 SQL Server 2005 中有一个作业设置 其中有一个操作系统 CmdExec 步骤 该步骤调用一个可能需要很长时间才能运行的程序 我发现 如果程序响应时间超过 1 分 40 秒 则该步骤将失败 并显示错误消息 操作已超时 该程
  • 检测类型是否是“映射”

    我想使用它们将 C 容器解析为另一个对象 iterator会员类型 迭代器成员类型指向单一类型 向量 队列等 对象的容器将变成类列表对象 迭代器成员类型指向单一类型对象的容器std pair将变成一个类似地图的物体 我试图编写一个成员函数来
  • Polymer,如何等待 core-ajax 完成后再渲染其他元素?

    更新 以下是针对这种情况的文档 条件模板使用 if 属性有条件地创建模板实例 这个应用程序 plnkr co 应执行以下操作 使用 core ajax 组件从数据库获取project location 本例中为JSON 使用 google
  • 如何在 Eclipse 中打印到 textArea 而不是控制台?

    我目前有一个程序 可以以各种方式将文本行打印到屏幕上 例如 System out println 语句 并且 for 循环将数组中的所有元素打印到屏幕上 我现在在一个单独的类中向该程序添加一个 GUI 我的问题是我想将打印到 Eclipse
  • 带坐标的平铺网格

    我正在尝试创建一个可以用 with 或 height 指定的网格 即 10 个框宽 x 20 个高 我已经创建了一个创建网格的脚本 但我想以一种可以以与我的方式不同的宽度和高度创建网格的方式进行制作 它当前创建一个宽度与高度相等的网格 并且