2011-12-09 20 views
6

Hago un dibujo personalizado de un Delphi TStringGrid utilizando el evento OnDrawCell. No hay problema con el área cubierta por celdas, pero ¿cómo pinto el fondo a la derecha de la columna de la derecha y debajo de la última fila?Cómo pinto el fondo de TStringGrid

(Editar) La pintura no es realmente necesaria, solo quiero establecer el color utilizado para el fondo. Estoy usando XE2 e investigando los estilos de VCL. Incluso en el dibujo por defecto, la configuración de colores en una cuadrícula, parece no tener ningún efecto.

TIA

+2

OK Finalmente lo encontré. El problema era la propiedad DrawingStyle de TStringGrid que tiene como valor predeterminado gdsThemed. Configurarlo en gdsClassic hace que las grillas se activen en Color - también para el fondo. Problema resuelto. Gracias a Andreas por una forma de controlar por completo el proceso de pintura de fondo, pero es una exageración para mi problema. rgds TheRoadrunner – TheRoadrunner

Respuesta

2

Esto es código que encontré con Google (No es de mí, no pude encontrar el nombre del autor, tal vez se trata de StackExchange en alguna forma ...). Define un descendiente de TStringGrid e implementa un nuevo dibujo de fondo. (El ejemplo usa un mapa de bits, pero puede cambiarlo fácilmente ...)

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

Es de una respuesta de NGLN aquí en SO. [delphi-stringgrid-with-picture-in-background] (http://stackoverflow.com/questions/5285659/delphi-stringgrid-with-picture-in-background). Se supone que debe usarse con una imagen en el fondo. –

+0

OK, ¡gracias! No debería ser un problema usar el código para dibujar otros fondos en la cuadrícula. – Andreas

+2

Ningún problema en absoluto, pero para responder a la pregunta puede elaborar un poco más cómo dibujar un color de fondo. –

Cuestiones relacionadas