3

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

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

4

2 回答 2

2

您可以调用TBaseVirtualTree.GetDisplayRect以确定节点的文本边界。根据Unclipped参数,它将为您提供完整或实际的文本宽度。TextOnly应设置为True

function IsTreeTextClipped(Tree: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex): Boolean;
var
  FullRect, ClippedRect: TRect;
begin
  FullRect := Tree.GetDisplayRect(Node, Column, True, True);
  ClippedRect := Tree.GetDisplayRect(Node, Column, True, False);
  Result := (ClippedRect.Right - ClippedRect.Left) < (FullRect.Right - FullRect.Left);
end;

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

于 2010-01-20T09:39:15.403 回答
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

于 2010-01-20T15:57:47.900 回答