2

使用鼠标选择单元格并单击按钮后,如何在 Delphi drawgrid 单元格内绘制。按下按钮后要绘制的单元格。

4

1 回答 1

4

将绘图信息存储在单独的容器中,例如具有与网格中单元格相同数量的项目的数组,然后使用网格的OnDrawCell事件使用当前存储在容器中的信息根据需要绘制单元格。要更新绘图,只需根据需要更新容器的内容,然后更新Invalidate()网格以触发重绘,以便OnDrawCell事件使用新信息。

更新:例如:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Grids;

type
  CellInfo = record
    BkColor: TColor;
  end;

  TForm1 = class(TForm)
    DrawGrid1: TDrawGrid;
    Button1: TButton;
    procedure DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    Cells: array of CellInfo;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses
  Vcl.ExtCtrls;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  R: TGridRect;
  Row, Col: Integer;
begin
  R := DrawGrid1.Selection;
  for Row := R.Top to r.Bottom do
  begin
    for Col := R.Left to R.Right do
    begin
      Cells[(Row * DrawGrid1.ColCount) + Col].BkColor := clBlue;
    end;
  end;
  DrawGrid1.Invalidate;
end;

procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  CellIndex: Integer;
begin
  CellIndex := (ARow * DrawGrid1.ColCount) + ACol;

  if gdFixed in State then
  begin
    DrawGrid1.Canvas.Brush.Color := DrawGrid1.FixedColor;
  end
  else if (State * [gdSelected, gdHotTrack]) <> [] then
  begin
    DrawGrid1.Canvas.Brush.Color := clHighlight;
  end else
  begin
    DrawGrid1.Canvas.Brush.Color := Cells[CellIndex].BkColor;
  end;

  DrawGrid1.Canvas.FillRect(Rect);

  if gdFixed in State then
    Frame3D(DrawGrid1.Canvas, Rect, clHighlight, clBtnShadow, 1);

  if gdFocused in State then
    DrawGrid1.Canvas.DrawFocusRect(Rect);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  SetLength(Cells, DrawGrid1.RowCount * DrawGrid1.ColCount);
  for I := Low(Cells) to High(Cells) do
  begin
    Cells[I].BkColor := DrawGrid1.Color;
  end;
end;

end.
于 2013-06-18T19:14:55.033 回答