2010-01-20 1 views
3

Когда TVirtualStreeTree.HintMode = hmTooltip, текст узла станет текстом подсказки при наведении курсора мыши на узел и столбец, где текст узла не отображается полностью. Но я должен установить HintMode = hmHint, чтобы я мог в четном обработчике подавать различный текст подсказки, основанный на позиции текущего курсора мыши, и в этом HintMode текст подсказки не генерируется автоматически.

Мой вопрос заключается в том, как узнать, отображается ли текст узла полностью или нет, так что я знаю, должен ли я указывать текст узла или пустую строку в качестве текста подсказки?
Спасибо.Virtual StringTree: как определить, полностью ли отображается текст узла?

ответ

1

Вы можете позвонить 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; 

Обратите внимание, что функция будет неявно инициализировать узел, если он не был инициализирован еще.

+0

Спасибо TOndrej, ваш код работал как шарм! Я попытался GetDisplayRect, но я не заметил, что мы можем выполнить эту задачу, используя эту функцию в одиночку! –

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.

+0

Привет, Роб, извините, я не пробовал это, так как код TOndrej работал, спасибо вам все равно! –

Смежные вопросы