7

文字列グリッドのセルのキャンバスに描画したい。これは、文字列グリッドにプリロードされた画像の上に表示されます。

私が持っているもの

現在、画像の上に描画する代わりに、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を再描画するときに問題を引き起こす可能性があります。

誰かが私の問題を回避する方法を見ることができますか?

よろしくお願いします、ジョシュ

4

2 に答える 2

4

コントロールのキャンバスであるキャンバスは1つだけです。各セルは、このキャンバス内の単なる長方形です。キャンバス内の現在のセルの位置を見つけるのは簡単です。確かに、これはRectパラメータの目的です。Rect.Leftはセルのx座標であり、はセルRect.Topのy座標です。

それとも私はあなたの質問を誤解しましたか?

于 2011-03-05T14:31:55.263 に答える
3

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
);
于 2011-03-05T14:35:33.563 に答える