Virtual StringTree:如何确定节点文本是否完全显示?

时间:2010-01-20 04:57:19

标签: delphi virtualtreeview

当TVirtualStreeTree.HintMode = hmTooltip时,当鼠标悬停在节点文本未完全显示的节点和列上时,节点文本将成为提示文本。但是我必须设置HintMode = hmHint,以便我可以在偶数处理程序中根据当前鼠标光标的位置提供各种提示文本,并且在该HintMode中不会自动生成提示文本。

我的问题是如何知道节点文本是否完全显示,以便我知道我应该提供节点文本还是空字符串作为提示文本?
感谢。

2 个答案:

答案 0 :(得分:2)

您可以调用TBaseVirtualTree.GetDisplayRect来确定节点的文本范围。根据{{​​1}}参数,它将为您提供完整或实际的文本宽度。 Unclipped应设置为TextOnly

True

请注意,如果节点尚未初始化,该函数将隐式初始化该节点。

答案 1 :(得分:0)

您可以使用树控件本身使用的内容。以下是cm_HintShow模式生效时单行节点的hmTooltip消息处理程序的摘录。

NodeRect := GetDisplayRect(HitInfo.HitNode, HitInfo.HitColumn, True, True, True);
BottomRightCellContentMargin := DoGetCellContentMargin(HitInfo.HitNode, HitInfo.HitColumn
, ccmtBottomRightOnly);

ShowOwnHint := (HitInfo.HitColumn > InvalidColumn) and PtInRect(NodeRect, CursorPos) and
  (CursorPos.X <= ColRight) and (CursorPos.X >= ColLeft) and
  (
    // Show hint also if the node text is partially out of the client area.
    // "ColRight - 1", since the right column border is not part of this cell.
    ( (NodeRect.Right + BottomRightCellContentMargin.X) > Min(ColRight - 1, ClientWidth) ) or
    (NodeRect.Left < Max(ColLeft, 0)) or
    ( (NodeRect.Bottom + BottomRightCellContentMargin.Y) > ClientHeight ) or
    (NodeRect.Top < 0)
  );

如果ShowOwnHint为真,那么您应该将节点的文本作为提示文本返回。否则,请将提示文本留空。

使用该代码的主要障碍是DoGetCellContentMargin受到保护,因此您无法直接调用它。您可以编辑源以使其公开,也可以在自己的函数中复制其功能;如果你没有处理OnBeforeCellPaint事件,那么它总是返回(0,0)。

HitInfo数据来自GetHitTestInfoAt