2010-01-20 5 views
3

TVirtualStreeTree.HintMode = hmTooltip 인 경우 노드 텍스트가 완전히 표시되지 않은 노드 및 열 위에 마우스를 올려 놓으면 노드 텍스트가 힌트 텍스트가됩니다. 그러나 HintMode = hmHint를 설정해야합니다. 그래서 심지어 짝수 핸들러에서 현재 마우스 커서의 위치를 ​​기반으로 다양한 힌트 텍스트를 제공하고 힌트 텍스트가 자동으로 생성되지 않습니다.

내 질문은 노드 텍스트가 완전하게 표시되는지 아닌지를 아는 방법입니다. 그래서 노드 텍스트 또는 빈 문자열을 힌트 텍스트로 제공해야합니까?
감사합니다.Virtual StringTree : 노드 텍스트가 완전히 표시되었는지 확인하는 방법은 무엇입니까?

답변

1

TBaseVirtualTree.GetDisplayRect을 호출하여 노드의 텍스트 범위를 결정할 수 있습니다. Unclipped 매개 변수에 따라 전체 또는 실제 텍스트 너비가 표시됩니다. TextOnlyTrue로 설정해야합니다 : 그것은 아직 초기화되어 있지 않은 경우 함수가 암시 적으로 노드를 초기화합니다

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

트리 컨트롤 자체에서 사용할 항목을 사용할 수 있습니다. 다음은 hmTooltip 모드가 적용될 때 단일 행 노드에 대한 cm_HintShow 메시지 처리기에서 발췌 한 내용입니다. ShowOwnHint이 참

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) 
); 

경우에, 당신은 힌트 텍스트로 노드의 텍스트를 반환해야합니다. 그렇지 않으면 힌트 텍스트를 공백으로 두십시오.

해당 코드를 사용하는 데있어서 가장 큰 장애물은 DoGetCellContentMargin이 보호되어 있으므로 직접 호출 할 수 없다는 것입니다. 소스를 편집하여 공개하거나 자신의 기능에서 기능을 복제 할 수 있습니다. OnBeforeCellPaint 이벤트를 처리하지 않으면 항상 (0, 0)을 반환합니다.

HitInfo 데이터는 GetHitTestInfoAt에서 가져온 것입니다.

+0

안녕하세요 롭, 미안 해요, TOndrej의 코드가 작동 한 이후로 시도하지 않았습니다. 모두 감사합니다! –

관련 문제