C ++ Builder如何访问DrawGrid中的特定单元格

时间:2018-12-13 21:13:29

标签: drawing c++builder

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

请帮助:)

1 个答案:

答案 0 :(得分:2)

TDrawGrid是所有者绘制的组件。它不会跟踪任何每个单元格的数据,这就是为什么您找不到与之相关的任何信息的原因(不同于TStringGrid,它会在其每个单元格的基础上为您跟踪字符串和对象指针Cells属性)。

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

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

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

无论哪种方式,每当您“移动”图块时,都需要根据需要更新适当的数组/列表元素,然后Invalidate()整个网格(或至少InvalidateCell()受影响的单元格)来触发重涂。

话虽如此,您可以考虑使用TPaintBox而不是TDrawGrid。使用其OnPaint事件,您可以随时随地绘制任何内容。保留活动图块及其当前x / y坐标的列表,然后在触发OnPaint时简单地绘制所有活动图块,使事情变得更易于管理,而不必担心处理单个对象的粒度细胞。