Как мне нарисовать фон TStringGrid - PullRequest
6 голосов
/ 09 декабря 2011

Я делаю пользовательское рисование Delphi TStringGrid, используя событие OnDrawCell.Нет проблем с областью, покрытой ячейками, но как мне нарисовать фон справа от самого правого столбца и ниже последней строки?

(Правка) Рисование не является действительно необходимым, я просто хочу установитьцвет, используемый для фона.Я использую XE2 и исследую стили VCL.Даже на чертеже по умолчанию, установка Цвета в сетке, швы не имеют никакого эффекта.

TIA

1 Ответ

2 голосов
/ 09 декабря 2011

Это какой-то код, который я нашел с помощью Google (это не от меня, я не смог найти имя автора, может быть, это каким-то образом происходит от 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;
...