2011-12-09 30 views
6

OnDrawCellイベントを使用してDelphi TStringGridのカスタム描画を行います。 セルで覆われている領域に問題はありませんが、一番右の列の背景を最後の行の下にペイントするにはどうすればよいですか?TStringGridの背景をペイントする方法

(編集) 絵画は本当に必要ではなく、背景に使用する色を設定したいだけです。 私はXE2を使用してVCLスタイルを調査しています。 デフォルトの描画でも、文字列グリッドに色を設定しても、継ぎ目はまったく効果がありません。 TIA

+2

OK最終的に見つかりました。 問題は、既定値がgdsThemedのTStringGridのDrawingStyleプロパティでした。 gdsClassicに設定すると、グリッドのColorプロパティが背景に反映されます。 問題が解決しました。 バックグラウンドペインティングプロセスを完全に制御する方法については、Andreasに感謝します。しかし、それは私の問題では残酷です。 rgds TheRoadrunner – TheRoadrunner

答えて

2

この

は、私は(それは私からではない、私は...多分それはいくつかの方法で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; 
+1

これはNGLNの回答からです。 [delphi-stringgrid-with-picture-in-background](http://stackoverflow.com/questions/5285659/delphi-stringgrid-with-picture-in-background)それは、バックグラウンドで写真と一緒に使用されるはずです。 –

+0

OK、ありがとうございます!グリッドに他の背景を描画するためにコードを使用することは問題ありません。 – Andreas

+2

全く問題はありませんが、背景色を描く方法をもう少し詳しく説明することができます。 –

関連する問題