2011-12-09 88 views
6

我使用OnDrawCell事件來自定義繪製Delphi TStringGrid。 單元格覆蓋的區域沒有問題,但是如何繪製最右邊一列和最後一行下面的背景?我如何繪製TStringGrid的背景

(編輯) 繪畫不是真的必要的,我只是想設置用於背景的顏色。 我正在使用XE2並調查VCL樣式。 即使在默認繪圖中,設置字符串網格中的顏色,接縫根本沒有任何效果。

TIA

+2

好的我終於找到了。 問題是TStringGrid的DrawingStyle屬性默認爲gdsThemed。 將其設置爲gdsClassic使網格顏色屬性踢入 - 也用於背景。 問題解決。 感謝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在這裏回答SO。 [Delphi的-stringgrid與 - 子母背景](http://stackoverflow.com/questions/5285659/delphi-stringgrid-with-picture-in-background)。它應該與背景中的圖片一起使用。 –

+0

好的,謝謝!使用代碼將其他背景繪製到網格上應該沒有問題。 – Andreas

+2

完全沒問題,但要回答這個問題,您可以詳細闡述如何繪製背景顏色。 –