Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Горизонтальное отображение изображений в TVirtualTreeView с помощью OnBeforePaint

Delphi , Синтаксис , Деревья

При работе с компонентом TVirtualTreeView в Delphi может возникнуть потребность в горизонтальном отображении изображений в ячейках дерева. Вопрос, поставленный пользователем, как раз касается этой проблемы. В данной статье мы рассмотрим, как решить данную задачу с помощью события OnBeforePaint.

Пользователь предоставил следующий код, который рисует изображения в ячейках дерева вертикально:

procedure TForm2.VDTAniBeforeCellPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
var
  Data: PAnimeData;
  NewRect: TRect;
begin
  if not Assigned(Node) then
    exit;

  Data := VDTAni.GetNodeData(Node);

  case Column of
    0, 1, 2, 3, 4, 5, 6, 7:
    begin
      TargetCanvas.Brush.Style := bsClear;
      TargetCanvas.FillRect(CellRect);
      NewRect := ContentRect;
      NewRect.Left := NewRect.Left;
      NewRect.Width := 55;
      NewRect.Height := 55;
      NewRect.Top := NewRect.Top + 2;
      NewRect.Bottom := NewRect.Bottom;

      if Column = 0 then
      begin
        with NewRect do
          TargetCanvas.StretchDraw(NewRect, Data.FObject.anmigraphic);
      end;
    end;
  end;
end;

Изображения рисуются вертикально, так как пользователь рисует изображение только в первом столбце (if Column = 0 then). Чтобы отобразить изображения горизонтально, как на приведенном изображении, нам нужно изменить код, чтобы рисовать изображения во всех восьми столбцах.

Сначала давайте изменим структуру данных, чтобы хранить восемь изображений в каждом узле:

type
  TAnmiClass = class
  private
    Fanmigraphic: TGifImage;
    FImage1: TGifImage;
    FImage2: TGifImage;
    FImage3: TGifImage;
    FImage4: TGifImage;
    FImage5: TGifImage;
    FImage6: TGifImage;
    FImage7: TGifImage;
    FImage8: TGifImage;
  public
    property anmigraphic: TGifImage read Fanmigraphic write Fanmigraphic;
    property Image1: TGifImage read FImage1 write FImage1;
    property Image2: TGifImage read FImage2 write FImage2;
    property Image3: TGifImage read FImage3 write FImage3;
    property Image4: TGifImage read FImage4 write FImage4;
    property Image5: TGifImage read FImage5 write FImage5;
    property Image6: TGifImage read FImage6 write FImage6;
    property Image7: TGifImage read FImage7 write FImage7;
    property Image8: TGifImage read FImage8 write FImage8;
  end;

type
  PAnimeData = ^TAnimeData;

  TAnimeData = record
    FObject: TAnmiClass;
  end;

Теперь мы можем изменить процедуру VDTAniBeforeCellPaint, чтобы рисовать изображения во всех восьми столбцах:

procedure TForm2.VDTAniBeforeCellPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
var
  Data: PAnimeData;
  NewRect: TRect;
begin
  if not Assigned(Node) then
    exit;

  Data := VDTAni.GetNodeData(Node);

  case Column of
    0, 1, 2, 3, 4, 5, 6, 7:
    begin
      TargetCanvas.Brush.Style := bsClear;
      TargetCanvas.FillRect(CellRect);
      NewRect := CellRect;
      NewRect.Width := NewRect.Width div 8;

      case Column of
        0: TargetCanvas.StretchDraw(NewRect, Data.FObject.anmigraphic);
        1: TargetCanvas.StretchDraw(NewRect, Data.FObject.Image1);
        2: TargetCanvas.StretchDraw(NewRect, Data.FObject.Image2);
        3: TargetCanvas.StretchDraw(NewRect, Data.FObject.Image3);
        4: TargetCanvas.StretchDraw(NewRect, Data.FObject.Image4);
        5: TargetCanvas.StretchDraw(NewRect, Data.FObject.Image5);
        6: TargetCanvas.StretchDraw(NewRect, Data.FObject.Image6);
        7: TargetCanvas.StretchDraw(NewRect, Data.FObject.Image7);
      end;

      NewRect.Offset(NewRect.Width, 0);
    end;
  end;
end;

В данном примере мы рисуем восемь изображений в восьми столбцах, каждый из которых имеет ширину, равную ширине ячейки дерева, деленной на восемь. Мы также смещаем прямоугольник рисования на ширину изображения после рисования каждого изображения, чтобы следующее изображение было нарисовано справа от предыдущего.

Приведенный выше код решает проблему пользователя и отображает изображения горизонтально в TVirtualTreeView с помощью события OnBeforePaint.

Создано по материалам из источника по ссылке.

Статья описывает решение для горизонтального отображения изображений в ячейках дерева компонента TVirtualTreeView в Delphi с помощью события OnBeforePaint.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Деревья ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 10:57:00/0.0052311420440674/1