我需要知道如何为虚拟树组件中的每个节点存储和加载两个不同的图标,这两个图标的大小也不同
由于
答案 0 :(得分:4)
除非你打算全部绘制所有东西,否则我不知道支持异构图标大小的控件,Virtual Treeview包括。给定视图的所有图标均来自单个TImageList
控件,而TImageList
一次只支持一个图像大小。
通过使图像大小为较大图标的大小,然后将较小的图标绘制到恰好用透明边框填充的较大图标上,可以使图标显示以具有不同的大小。
如果您一次只需要支持一个图标大小,那么您可以维护两个单独的TImageList
控件。如果要切换大小,请重新分配树控件的ImageList
属性。您可能还需要调整DefaultNodeHeight
属性以及已存在的所有节点的高度。
答案 1 :(得分:0)
这适用于我使用TPngImageList。我假设这个实现应该适用于标准的TImageList,但是使用png图像是更好的选择。
在此示例中,表单类名称为" TfPrj",TvirtualStringTree实例名称为" vPrj",TMyDataRecord是您获取数据的记录结构。
在您的代码中管理这样的自定义绘图。
var
p: TMyDataRecord;
const
riskImagesSize=64;
riskImagesPadding=2;
procedure FindP(Node: PVirtualNode);
begin
// This procedure fill in the "p" record with your tree data for the node.
end;
procedure TfPrj.vPrjMeasureItem(Sender: TBaseVirtualTree; TargetCanvas: TCanvas;
Node: PVirtualNode; var NodeHeight: Integer);
begin
FindP(Node);
if p<>nil then
if p.LargeImages then
NodeHeight := riskImagesSize+riskImagesPadding*2;
end;
procedure TfPrj.vPrjBeforeCellPaint(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
begin
if Column=0 then begin
FindP(Node);
if p<>nil then begin
if p.LargeImages then begin
Inc(ContentRect.Left,riskImagesSize);
end;
end;
end;
procedure TfPrj.vPrjDrawText(Sender: TBaseVirtualTree; TargetCanvas: TCanvas;
Node: PVirtualNode; Column: TColumnIndex; const Text: string;
const CellRect: TRect; var DefaultDraw: Boolean);
var
i: integer;
s: string;
begin
FindP(Node);
if Column=0 then
if p<>nil then
if p.LargeImages then begin
iLarge.Draw(TargetCanvas,CellRect.Left-riskImagesSize-riskImagesPadding*2,CellRect.Top+riskImagesPadding,p.LargeImagesIndex);
end;
end;
procedure TfPrj.vPrjGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode;
Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean;
var ImageIndex: Integer);
begin
if Column<>0 then
Exit;
FindP(Node);
if p.LargeImages then
ImageIndex=-1
else
// Assign the image index for standard TPngImageList
end;