3

TVirtualStreeTree.HintMode = hmTooltipの場合、ノードテキストが完全に表示されていないノードおよび列にマウスを合わせると、ノードテキストがヒントテキストになります。ただし、HintMode = hmHintを設定する必要があります。これにより、偶数ハンドラーで現在のマウスカーソルの位置に基づいてさまざまなヒントテキストを指定でき、その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)
  );

trueの場合ShowOwnHint、ノードのテキストをヒントテキストとして返す必要があります。それ以外の場合は、ヒントテキストを空白のままにします。

そのコードを使用する際の主な障害は、DoGetCellContentMargin保護されているため、直接呼び出すことができないことです。ソースを編集して公開するか、独自の関数でその機能を複製することができます。イベントを処理していない場合はOnBeforeCellPaint、とにかく常に(0、0)を返します。

データはのHitInfo呼び出しから取得されGetHitTestInfoAtます。

于 2010-01-20T15:57:47.900 に答える