当 TVirtualStreeTree.HintMode = hmTooltip 时,当鼠标悬停在节点文本未完全显示的节点和列上时,节点文本将成为提示文本。但是我必须设置 HintMode = hmHint,以便我可以在 even 处理程序中根据当前鼠标光标的位置提供各种提示文本,并且在该 HintMode 中不会自动生成提示文本。
我的问题是如何知道节点文本是否完全显示,以便我知道我应该提供节点文本还是空字符串作为提示文本?
谢谢。
问问题
1805 次
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 回答