我的表单上有一个virtualstringtree控件,它必须显示某些节点的图像列表中的图标。这样可以正常工作,但是,对于某些节点,它还必须显示与节点和方形一样高的自定义绘制图标。
我正在使用OnBeforeCellPaint事件来绘制这些图像并更改ContentRect以适应项目中所需的额外空间。
ContentRect.Offset(ContentRect.Height + 4, 0);
(+4与文本的“图标”具有相同的间距,与图像列表中加载的间距相同)
此方法似乎工作正常,节点绘制正确,选择矩形也是如此。但是,单击节点的hitbox似乎没有更新。我必须单击原始的ContentRect来选择节点。
如何更新hitbox?
答案 0 :(得分:4)
应该避免什么?
如果要更改节点的大小,请不要修改ContentRect
中的OnBeforeCellPaint
。 ContentRect
事件中的OnBeforeCellPaint
矩形用于修改将在其中呈现单元格的位置。它实际上并不修改节点的大小。通过ContentRect
偏移量,您只需将绘制移出节点的物理位置,从可以单击节点的位置开始。
如何调整节点高度?
默认的固定节点高度由DefaultNodeHeight
属性定义。如果您事先不知道所需的节点高度,则可以编写OnMeasureItem
事件的处理程序。在那里,您可以修改NodeHeight
参数值以调整节点的高度。
当您处理OnMeasureItem
事件时,请务必在toVariableNodeHeight
选项集中添加TreeOptions.MiscOptions
选项。
如何调整节点宽度?
具体来说,对于TVirtualStringTree
控制,节点宽度是通过测量的节点文本宽度增加2 *文本边距(由TextMargin
属性调整)来计算的。在节点文本宽度测量期间,OnMeasureTextWidth
事件将触发具有声明的Extent
参数,该参数包含测量的文本宽度。通过修改此Extent
参数,您将影响节点的总宽度,因为此事件仅在内部用于此目的。
因此,增加每个节点宽度,例如通过20像素,您可以编写以下内容:
procedure TForm1.VirtualStringTree1MeasureTextWidth(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
const Text: string; var Extent: Integer);
begin
Extent := Extent + 20;
end;
以下是没有和修改了文本范围的结果:
对于TVirtualDrawTree
控制,情况要容易得多。它具有OnGetNodeWidth
事件,用于通过其NodeWidth
声明的参数指定节点宽度。