我使用绘画网格来展示一个"地牢"地图。我有一个数组,其中包含描述每个单元格中哪些类型的物理特征的数据。房间和走廊等的基本布局。每个排列都有一个PNG。
我试图"画"通过将适当的PNG绘制到绘图网格的每个单元格中来绘制地图。我可以使用 DrawGrid1.Canvas.Draw(x,y,pngImage)或多或少直接做到这一点,但是由于网格线(至少,I&I),确定精确的x,y(以像素为单位)令人沮丧#39;我发现它令人沮丧),而且我不确定我将遇到的其他问题。
我也尝试了 pngImage.Draw(DrawGrid1.Canvas,Rect),但我再次计算了Rect,这似乎是不必要的,因为单元格和PNG都是40x40像素。< / p>
阅读相关文章和示例,OnDrawCell似乎是一种更好的方法,因为给定ARow和ACol,给定单元格的Rect显然是预先计算的(除非我误解了我在几个地方读过的内容) )。但是我发现的所有例子都没有显示出如何触发OnDrawCell。简单的答案&#34;什么东西被吸引到一个单元格&#34;并没有真正解释得更好。 那是我想要做的事情。
(我经常发现德尔福的文档是这样的:如何解释(并不总是完全针对您的特定用例),但何时或为何被笼罩在神秘之中......)
当然,还有一些其他的事情需要弄清楚,比如控制绘制网格,以便在单击单元格时不会擦除PNG。
我们将非常感谢任何相关的建议。 TFRM
答案 0 :(得分:-1)
为什么如此难以确定像素中的精确X和Y?它实际上非常简单。
为了获得矩形的左边框,只需将列的宽度加上网格线的宽度乘以列的数量即可。如果您在第一列的最左侧有网格线,则添加网格线的宽度。
为了获得矩形的右边框,只需将列的宽度添加到上一个结果中即可。
为了计算Y,你只需使用高度而不是宽度
所以代码看起来像这样(从我的脑海中编写而未经测试)
const
CellWidth = 40;
CellHeight = 40;
GridLineThickness = 1;
procedure DrawCell(Row, Column: Integer; Image: Bitmap);
var Rect: TRect;
begin
Rect.Left := ((CellWidth + GridLineThickness) * Column) + GridLineThickness;
Rect.Right := Rect.Left + CellWidth;
Rect.Top := ((CellHeight + GridLineThickness) * Row) + GridLineThickness;
Rect.Bottom := Rect.Top + CellHeight;
PaintBox1.Canvas.StretchDraw(Rect, Image);
end;
如果你想要放大或缩小的能力,只需将CellWidth和CellHeight乘以缩放系数即可。当缩小时,只需省略渲染网格线。