2011-12-09 28 views
6

Tôi vẽ bản vẽ tùy chỉnh của Delphi TStringGrid bằng sự kiện OnDrawCell. Không có vấn đề gì với khu vực được bao phủ bởi các ô, nhưng làm cách nào để tô màu nền bên phải của cột ngoài cùng bên phải và bên dưới hàng cuối cùng?Làm cách nào để vẽ nền của TStringGrid

(Chỉnh sửa) Vẽ tranh không thực sự cần thiết, tôi chỉ muốn đặt màu được sử dụng cho nền. Tôi đang sử dụng XE2 và điều tra phong cách VCL. Ngay cả trong bản vẽ mặc định, thiết lập Màu sắc trong một chuỗi, các đường nối không có hiệu lực nào cả.

TIA

+2

OK Cuối cùng tôi đã tìm thấy nó. Vấn đề là thuộc tính DrawingStyle của TStringGrid mặc định là gdsThemed. Đặt nó thành gdsClassic làm cho lưới Thuộc tính màu bắt đầu - cũng cho nền. Sự cố được giải quyết. Nhờ có một cách để hoàn toàn kiểm soát quá trình vẽ nền, nhưng đó là một vấn đề quá mức cho vấn đề của tôi. rgds TheRoadrunner – TheRoadrunner

Trả lời

2

Đây là một số mã tôi tìm thấy với google (Nó không phải là từ tôi, tôi không thể tìm thấy tên của tác giả, có lẽ nó xuất phát từ StackExchange trên một cách nào đó ...). Nó định nghĩa một hậu duệ của TStringGrid và thực hiện một bản vẽ nền mới. (Ví dụ sử dụng bitmap, nhưng bạn có thể dễ dàng thay đổi điều đó ...)

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

Từ câu trả lời của NGLN tại đây trên SO. [delphi-stringgrid-với-hình-trong-nền] (http://stackoverflow.com/questions/5285659/delphi-stringgrid-with-picture-in-background). Đó là nghĩa vụ phải được sử dụng với một hình ảnh trong nền. –

+0

OK, cảm ơn bạn! Không có vấn đề gì khi sử dụng mã để vẽ các hình nền khác lên lưới. – Andreas

+2

Không có vấn đề gì cả, nhưng để trả lời câu hỏi bạn có thể giải thích thêm một chút về cách vẽ màu nền. –

Các vấn đề liên quan