gpt4 book ai didi

image - Delphi - 绘制到字符串网格中选定单元格的 Canvas - 可能吗?

转载 作者:行者123 更新时间:2023-12-03 14:53:14 25 4
gpt4 key购买 nike

我想在字符串网格中的单元格的 Canvas 上进行绘制。这将位于预加载到字符串网格中的图像之上。

我有什么

目前,我不是在图像顶部绘制,而是加载第二个透明图像,然后在单元格顶部绘制。这是我使用的代码并且它有效。

procedure TfrmCavern.StringGridDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
index : integer;
I : integer;
begin
// Calculate the corresponding linear index
index := LinearIndexOf(ARow, ACol);
//Draw image referenced to cell
StringGrid.Canvas.StretchDraw(Rect, CellDetails[index].Images.Picture.Graphic);

//if player present draw corresponding player image
for I := 0 to frmWelcome.NoofPlayers - 1 do
begin
if index = Players[I].pIndex then StringGrid.Canvas.StretchDraw(Rect,Players[I].UserImage.Picture.Graphic);
end;
end;
end;

该过程首先绘制引用单元格的图像。如果有“玩家”在场,它将把玩家的棋子画在上面。由于“玩家棋子”图像是透明的 .PNG 图像,因此下面的原始图像仍然可见。

我想要什么

此方法的缺点是,由于图像是恒定的,“玩家棋子”位于单元格内的设定位置。我希望能够根据选择的单元格在单元格内的不同位置绘制“玩家棋子”。我有大约 200 个单元格,所以我真的不想手动创建那么多具有不同位置的图像。

我尝试过的

我尝试在drawcell过程中直接绘制到stringgrid的 Canvas 上,但这似乎引用了整个stringgrid而不是正在绘制的当前单元格。

StringGrid.Canvas.ellipse(10,10,50,50);

我已经看过,但我似乎无法引用当前单元格的 Canvas - 我认为它不存在?

我尝试的下一件事是绘制临时图像,然后将图像绘制到单元格。

TempImage.Canvas.Ellipse(10,10,50,50);
StringGrid.Canvas.StretchDraw(Rect, TempImage.Picture.Graphic);

这在一定程度上有效,它确实将图像绘制到单元格中,但是图像具有不透明的背景/ Canvas ,因此单元格是白色的,上面有圆圈,下面的图像不可见。我做了一些研究,但找不到使图像 Canvas 透明的方法。

我能想到的最后一件事是编写一个算法来定位当前单元格的左上角,然后从那里直接绘制到 Canvas ,但这可能会很麻烦,并且在重新绘制字符串网格时会产生问题。

有人能找到解决我的问题的方法吗?

提前致谢,乔什

最佳答案

OnDrawCell 的 Rect 参数指定特定单元格相对于网格客户端坐标系的边界。因此,您需要绘制位于该矩形内的坐标。在您的事件处理程序中尝试类似的操作:

StringGrid.Canvas.Pen.Color := clBlack;
StringGrid.Canvas.Brush.Style := bsClear;
StringGrid.Canvas.Ellipse(
Rect.Left+5,
Rect.Top+5,
Rect.Left+15,
Rect.Top+15
);

关于image - Delphi - 绘制到字符串网格中选定单元格的 Canvas - 可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5204357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com