OnDrawCellイベントを使用してDelphi TStringGridのカスタム描画を行います。 セルで覆われている領域に問題はありませんが、一番右の列の背景を最後の行の下にペイントするにはどうすればよいですか?TStringGridの背景をペイントする方法
(編集) 絵画は本当に必要ではなく、背景に使用する色を設定したいだけです。 私はXE2を使用してVCLスタイルを調査しています。 デフォルトの描画でも、文字列グリッドに色を設定しても、継ぎ目はまったく効果がありません。 TIA
OnDrawCellイベントを使用してDelphi TStringGridのカスタム描画を行います。 セルで覆われている領域に問題はありませんが、一番右の列の背景を最後の行の下にペイントするにはどうすればよいですか?TStringGridの背景をペイントする方法
(編集) 絵画は本当に必要ではなく、背景に使用する色を設定したいだけです。 私はXE2を使用してVCLスタイルを調査しています。 デフォルトの描画でも、文字列グリッドに色を設定しても、継ぎ目はまったく効果がありません。 TIA
この
は、私は(それは私からではない、私は...多分それはいくつかの方法でStackExchangeから来て、作者の名前を見つけることができませんでした)グーグルで見つかったいくつかのコードです。 TStringGridの子孫を定義し、新しい背景の描画を実装します。 (この例ではビットマップを使用していますが、簡単に変更することができます...)
type
TStringGrid = class(Grids.TStringGrid)
private
FGraphic: TGraphic;
FStretched: Boolean;
function BackgroundVisible(var ClipRect: TRect): Boolean;
procedure PaintBackground;
protected
procedure Paint; override;
procedure Resize; override;
procedure TopLeftChanged; override;
public
property BackgroundGraphic: TGraphic read FGraphic write FGraphic;
property BackgroundStretched: Boolean read FStretched write FStretched;
end;
TForm1 = class(TForm)
StringGrid: TStringGrid;
Image: TImage;
procedure FormCreate(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TStringGrid }
function TStringGrid.BackgroundVisible(var ClipRect: TRect): Boolean;
var
Info: TGridDrawInfo;
R: TRect;
begin
CalcDrawInfo(Info);
SetRect(ClipRect, 0, 0, Info.Horz.GridBoundary, Info.Vert.GridBoundary);
R := ClientRect;
Result := (ClipRect.Right < R.Right) or (ClipRect.Bottom < R.Bottom);
end;
procedure TStringGrid.Paint;
begin
inherited Paint;
PaintBackground;
end;
procedure TStringGrid.PaintBackground;
var
R: TRect;
begin
if (FGraphic <> nil) and BackgroundVisible(R) then
begin
with R do
ExcludeClipRect(Canvas.Handle, Left, Top, Right, Bottom);
if FStretched then
Canvas.StretchDraw(ClientRect, FGraphic)
else
Canvas.Draw(0, 0, FGraphic);
end;
end;
procedure TStringGrid.Resize;
begin
inherited Resize;
PaintBackground;
end;
procedure TStringGrid.TopLeftChanged;
begin
inherited TopLeftChanged;
PaintBackground;
end;
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
// Usage:
StringGrid.BackgroundGraphic := Image.Picture.Graphic;
StringGrid.BackgroundStretched := True;
end;
これはNGLNの回答からです。 [delphi-stringgrid-with-picture-in-background](http://stackoverflow.com/questions/5285659/delphi-stringgrid-with-picture-in-background)それは、バックグラウンドで写真と一緒に使用されるはずです。 –
OK、ありがとうございます!グリッドに他の背景を描画するためにコードを使用することは問題ありません。 – Andreas
全く問題はありませんが、背景色を描く方法をもう少し詳しく説明することができます。 –
OK最終的に見つかりました。 問題は、既定値がgdsThemedのTStringGridのDrawingStyleプロパティでした。 gdsClassicに設定すると、グリッドのColorプロパティが背景に反映されます。 問題が解決しました。 バックグラウンドペインティングプロセスを完全に制御する方法については、Andreasに感謝します。しかし、それは私の問題では残酷です。 rgds TheRoadrunner – TheRoadrunner