Вы можете использовать то, что использует сам элемент управления деревом.Вот выдержка из обработчика сообщений 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
true, то вы должны вернуть текст узла в качестве подсказкитекст.В противном случае оставьте текст подсказки пустым.
Основным препятствием для использования этого кода является то, что DoGetCellContentMargin
защищен, поэтому вы не можете вызвать его напрямую.Вы можете либо отредактировать источник, чтобы сделать его общедоступным, либо дублировать его функциональность в своей собственной функции;если вы не обрабатываете событие OnBeforeCellPaint
, то оно всегда возвращает (0, 0) в любом случае.
Данные HitInfo
поступают из вызова GetHitTestInfoAt
.