C++ 构建器如何访问 DrawGrid 中的特定单元格

C++ builder How to access a specific cell in a DrawGrid

我正在使用 C++ Builder 开发俄罗斯方块游戏。我想在 TDrawGrid 上绘制我的作品,但我找不到任何允许我访问我应该在其中绘制的特定单元格的东西。我的意思是,我想在 x=2 列和 y=2 行中绘制(例如); 我只找到了 DrawGrid->CellRect(int, int)。但这并不好,因为我想将列和行作为参数发送(分隔)在不同的函数中,例如 MoveThePiece() 和 DrawThePiece();

请帮忙:)

TDrawGrid是自绘组件。它不跟踪任何每个单元格的数据,这就是为什么你找不到与之相关的任何东西(不像 TStringGrid,它在它的每个单元格的基础上为你跟踪字符串和对象指针Cells 属性).

您必须根据需要在您自己的代码中跟踪您自己的每个单元格状态数据。使用 OnDrawCell 事件,根据当前状态绘制每个单元格。不要试图从该事件之外在网格上绘制任何东西。

例如,您可以分配一个二维数组来保存您的单元格数据,其中每个元素跟踪一个单元格是空的还是包含一个(一块)图块。然后,在 OnDrawCell 事件中,使用提供的 RowCol 参数索引到数组中以获取单元格的当前状态,然后根据需要绘制单元格。

或者,如果您保留活动图块列表,则可以存储每个图块的 row/column 信息。然后在 OnDrawCell 事件中,您可以找到覆盖指定 Row/Col 的图块,如果找到,则在单元格内绘制该图块(的一部分),否则绘制(部分)背景。

无论哪种方式,每当您 "move" 周围的方块时,根据需要更新适当的 array/list 元素,然后 Invalidate() 整个网格(或至少 InvalidateCell()受影响的单元格)触发重绘。

也就是说,您可以考虑使用 TPaintBox 而不是 TDrawGrid。使用它的 OnPaint 事件,你可以随时随地绘制任何你想要的东西。保留活动图块及其当前 x/y 坐标的列表,然后在触发 OnPaint 时简单地绘制所有活动图块,使事情更容易管理,而不必担心处理的粒度与单个细胞。