При работе с компонентом 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). Чтобы отобразить изображения горизонтально, как на приведенном изображении, нам нужно изменить код, чтобы рисовать изображения во всех восьми столбцах.
Сначала давайте изменим структуру данных, чтобы хранить восемь изображений в каждом узле:
Теперь мы можем изменить процедуру 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.