在Delphi VCL项目中,我创建了一个包含两列的简单TVirtualStringTree
。第一列将包含标识所表示数据的Name
的文本。数据记录还包含状态字段。第二列用于表示使用图像(16x16像素)无文本的记录状态。
我已经搜索了演示,但还没有掌握VTV如何显示节点的完整过程,并且还没有成功获取要在指定列的节点中显示的图标。
所以我有三个相关的问题:
我在OnGetText
事件中看到文本是如何分配的,但我应该在哪里指定或更改图像以反映记录中的当前状态?
如何让图像实际显示在列中?
我的图片尺寸有限,还是比图标大?如果是,我是否需要更改任何设置以调整每行的高度(如果可能)?
答案 0 :(得分:5)
您需要为TImageList
属性分配(在您的情况下为16x16)TVirtualStringTree.Images
,然后处理事件OnGetImageIndex
,例如:
procedure TForm1.VirtualStringTree1GetImageIndex(Sender: TBaseVirtualTree;
Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
var Ghosted: Boolean; var ImageIndex: Integer);
var
NodeRec: PNodeRec;
begin
NodeRec := Sender.GetNodeData(Node);
if Assigned(NodeRec) then
begin
if (Column = 1) then
begin
if Kind in [ikNormal, ikSelected] then
begin
case NodeRec.Status of // check the needed status(es)
1: ImageIndex := 1; // whichever image you need
2: ImageIndex := 2; // whichever image you need
// ...
end;
end;
end;
end;
end;
我的图片尺寸有限,还是比图标大? 如果是这样,我是否需要更改任何设置以调整每个设置的高度 行(如果可能的话)
不确定你的意思,因为你声明需要16x16的图像。如果您需要具有可能不同维度的不同图像列表,则可以使用OnGetImageIndexEx
。对于可变高度,您可以在toVariableNodeHeight
中设置TreeOptions.MiscOptions
并处理OnMeasureItem
事件。另一种将图形绘制到VTV画布的方法是处理OnBeforeItemPaint
/ OnAfterItemPaint
。
答案 1 :(得分:0)
创建图像列表16x16(图像)并使用如下代码:
procedure TMyTreeView.OnDrawTextEx(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
const Text: string; const CellRect: TRect; var DefaultDraw: Boolean);
var i: integer;
begin
if (Node <> nil) then
begin
case Column of
cStatusColumn:
begin
DefaultDraw := false;
i := 0; // assign the image index from Images list here
if (i <> -1) then
begin
Images.Draw(TargetCanvas, CellRect.Left +
((CellRect.Width - Images.Width) div 2), CellRect.Top, i);
end;
end
else
begin
DefaultDraw := true;
end;
end;
end
else
begin
DefaultDraw := true;
end;
end;