gpt4 book ai didi

delphi - VirtualStringTree:修复OnBeforeCellPaint之后的节点命中框

转载 作者:行者123 更新时间:2023-12-03 18:28:06 25 4
gpt4 key购买 nike

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

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

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


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

这种方法似乎可以正常工作,可以正确绘制节点,选择矩形也可以。但是,单击节点的命中框似乎没有更新。我必须单击原始ContentRect以选择节点。

如何更新点击框?

最佳答案

要避免什么?

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


这是未修改文本范围的结果:



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

关于delphi - VirtualStringTree:修复OnBeforeCellPaint之后的节点命中框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13146789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com