VirtualStringTree:在OnBeforeCellPaint之后修复节点hitbox

时间:2012-10-30 20:04:41

标签: delphi virtualtreeview tvirtualstringtree

我的表单上有一个virtualstringtree控件,它必须显示某些节点​​的图像列表中的图标。这样可以正常工作,但是,对于某些节点,它还必须显示与节点和方形一样高的自定义绘制图标。

我正在使用OnBeforeCellPaint事件来绘制这些图像并更改ContentRect以适应项目中所需的额外空间。

ContentRect.Offset(ContentRect.Height + 4, 0);

(+4与文本的“图标”具有相同的间距,与图像列表中加载的间距相同)

此方法似乎工作正常,节点绘制正确,选择矩形也是如此。但是,单击节点的hitbox似乎没有更新。我必须单击原始的ContentRect来选择节点。

如何更新hitbox?

1 个答案:

答案 0 :(得分:4)

应该避免什么?

如果要更改节点的大小,请不要修改ContentRect中的OnBeforeCellPaintContentRect事件中的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;

以下是没有和修改了文本范围的结果:

enter image description here

对于TVirtualDrawTree控制,情况要容易得多。它具有OnGetNodeWidth事件,用于通过其NodeWidth声明的参数指定节点宽度。