小编Jos*_*ade的帖子

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

我想在字符串网格中绘制单元格的画布.这将在预先加载到字符串网格中的图像之上.

我得到了什么

目前,我没有在图像上绘图,而是加载第二个透明图像,然后在单元格顶部绘画.这是我使用的代码,它的工作原理.

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;
Run Code Online (Sandbox Code Playgroud)

该过程首先绘制参考单元格的图像.如果有"玩家"存在,则会将玩家的棋子画在上面.因为"播放器片段"图像是透明的.PNG图像,所以下面的原始图像仍然可见.

我想要的是

该方法的缺点是由于图像是恒定的,"播放器块"处于单元内的设定位置.我希望能够根据选择的单元格在单元格内的不同位置绘制"播放器块".我有大约200个单元格,所以我真的不想手动创建具有不同位置的许多图像.

我试过的

我已经尝试直接绘制到drawcell过程中的stringgrid的画布,但它似乎引用整个stringgrid而不是正在绘制的当前单元格.

StringGrid.Canvas.ellipse(10,10,50,50);
Run Code Online (Sandbox Code Playgroud)

我看了,但我似乎无法引用当前单元格的画布 - 我认为它不存在?

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

TempImage.Canvas.Ellipse(10,10,50,50);
StringGrid.Canvas.StretchDraw(Rect, TempImage.Picture.Graphic);
Run Code Online (Sandbox Code Playgroud)

这在某种程度上起作用,它确实将图像绘制到单元格,但是图像具有不透明的背景/画布,因此单元格是白色的,其上有圆圈,下方的图像不可见.我做了一些研究,但找不到一种方法来使图像的画布透明.

我能想到的最后一件事就是编写一个算法来定位当前单元格的左上角,然后从那里直接绘制到画布,但这可能是泥泞的,并且在重绘stringgrid时会产生问题.

任何人都能看到我的问题吗? …

delphi drawing canvas image tstringgrid

7
推荐指数
1
解决办法
8712
查看次数

除了Delphi中的默认"Sender:TObject"之外,是否可以向OnClick事件添加其他参数?

我正在使用Delphi进行A2计算项目,并且在向事件过程添加其他参数时遇到了问题.

我正在创建一些标签(TLabel对象)并将它们存储在我的主窗体"form1"下的数组中.

这就是我目前所拥有的:

**传递标签数组的声明和相应的ClickEvent过程,并传递标准(Sender:TObject)参数.

 public
     InventoryLabel : array [0..23] of TLabel;
     procedure InventoryLabelClick(Sender: TObject);
Run Code Online (Sandbox Code Playgroud)

**这是与上面声明的ClickEvent匹配的过程.(程序的内容非常混乱,但与问题相关,是我目前使用的.)

Procedure TForm1.InventoryLabelClick(Sender: TObject);
begin
if sender = InventoryLabel[0] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[0]].cardpic);
if sender = InventoryLabel[1] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[1]].cardpic);
if sender = InventoryLabel[2] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[2]].cardpic);
if sender = InventoryLabel[3] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[3]].cardpic);
if sender = InventoryLabel[4] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[4]].cardpic);
if sender = InventoryLabel[5] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[5]].cardpic);
if sender = InventoryLabel[6] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[6]].cardpic);
if sender = InventoryLabel[7] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[7]].cardpic);
if sender = InventoryLabel[8] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[8]].cardpic);
if sender = InventoryLabel[9] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[9]].cardpic);
if …
Run Code Online (Sandbox Code Playgroud)

delphi onclick parameter-passing

3
推荐指数
1
解决办法
3959
查看次数