文字列グリッドのセルのキャンバスに描画したい。これは、文字列グリッドにプリロードされた画像の上に表示されます。
私が持っているもの
現在、画像の上に描画する代わりに、2番目の透明な画像を読み込んでから、セルの上にペイントしています。これは私が使用するコードであり、機能します。
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のキャンバスに直接描画しようとしましたが、描画されていた現在のセルではなく、stringgrid全体を参照しているように見えました。
StringGrid.Canvas.ellipse(10,10,50,50);
調べましたが、現在のセルのキャンバスを参照できないようです-存在しないと思いますか?
次に試したのは、一時的な画像に描画してから、その画像をセルに描画することでした。
TempImage.Canvas.Ellipse(10,10,50,50);
StringGrid.Canvas.StretchDraw(Rect, TempImage.Picture.Graphic);
これはある程度機能し、セルに画像を描画しましたが、画像の背景/キャンバスが不透明であるため、セルは白く、円が表示され、下の画像は表示されませんでした。少し調べてみましたが、画像のキャンバスを透明にする方法が見つかりませんでした。
私が試みることを考えることができる最後のことは、現在のセルの左上の点を見つけて、そこからキャンバスに直接描画するアルゴリズムを書くことですが、それは汚くなり、stringgridを再描画するときに問題を引き起こす可能性があります。
誰かが私の問題を回避する方法を見ることができますか?
よろしくお願いします、ジョシュ