2

我的表单上有一个 virtualstringtree 控件,它必须为某些节点显示来自图像列表的图标。这很好用,但是,对于某些节点,它还必须显示与节点和正方形一样高的自定义绘制图标。

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

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

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

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

如何更新碰撞箱?

4

1 回答 1

4

要避免什么?

如果要更改节点的大小,请不要修改ContentRectin 。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声明的参数指定节点宽度。

于 2012-12-11T18:01:27.420 回答