Delphi StringGrid с картинкой в ​​фоновом режиме - PullRequest
3 голосов
/ 13 марта 2011

Привет, кто-нибудь знает, возможно ли отобразить изображение в качестве фона для сетки строк, или кто-нибудь знает о любом бесплатном компоненте сетки, который может это сделать.

Спасибо

Colin

Ответы [ 3 ]

12 голосов
/ 13 марта 2011

Вы можете использовать TDrawGrid (или TStringGrid), который поддерживает рисование владельцем, и сделать

procedure TForm1.FormCreate(Sender: TObject);
begin
  FBg := TBitmap.Create;
  FBg.LoadFromFile('C:\Users\Andreas Rejbrand\Pictures\Sample.bmp');
end;

, где FBg - это TBitmap (например, в классе формы), а затем выполните

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  r: TRect;
begin
  if not (Sender is TStringGrid) then Exit;
  BitBlt(TStringGrid(Sender).Canvas.Handle,
         Rect.Left,
         Rect.Top,
         Rect.Right - Rect.Left,
         Rect.Bottom - Rect.Top,
         FBg.Canvas.Handle,
         Rect.Left,
         Rect.Top,
         SRCCOPY);
  if gdSelected in State then
    InvertRect(TStringGrid(Sender).Canvas.Handle, Rect);
  r := Rect;
  TStringGrid(Sender).Canvas.Brush.Style := bsClear;
  DrawText(TStringGrid(Sender).Canvas.Handle,
           TStringGrid(Sender).Cells[ACol, ARow],
           length(TStringGrid(Sender).Cells[ACol, ARow]),
           r,
           DT_SINGLELINE or DT_VCENTER or DT_END_ELLIPSIS);
end;

Пример снимка экрана http://privat.rejbrand.se/drawgridbg.png Пример снимка экрана http://privat.rejbrand.se/drawgrid2.png Пример скриншота http://privat.rejbrand.se/drawgrid3.png

4 голосов
/ 25 мая 2011

Фактически отвечая здесь на явный вопрос о rossmcm в своем комментарии к коду Андреаса Рейбранда, он также дополняет его ответ на оригинальный вопрос.

Рисование изображения за границей сетки, но все еще в пределахГраницы управления StringGrid можно получить следующим образом:

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 голос
/ 13 марта 2011

Да, это возможно.TStringGrid наследуется от TDrawGrid и выполняет все рисование самостоятельно.Вы можете использовать событие OnDrawCell для создания пользовательского рисунка.

...