2

特定のノードのイメージリストからアイコンを表示する必要があるフォームのvirtualstringtreeコントロールが必要です。これは正常に機能しますが、特定のノードについては、ノードおよび正方形と同じ高さのカスタム描画アイコンも表示する必要があります。

OnBeforeCellPaintイベントを使用してこれらの画像を描画し、ContentRectを変更して、アイテムに必要な余分なスペースに対応しています。

ContentRect.Offset(ContentRect.Height + 4, 0);

(+4は、画像リストからロードされたものと同じテキストの「アイコン」からの間隔を持つためにあります)

この方法はうまく機能しているようで、ノードは正しく描画され、選択長方形も同様に描画されます。ただし、ノードをクリックするためのヒットボックスは更新されていないようです。元のContentRectをクリックしてノードを選択する必要があります。

ヒットボックスを更新するにはどうすればよいですか?

4

1 に答える 1

4

何を避けるべきですか?

ノードのサイズを変更する場合はContentRect、を変更しないでください。OnBeforeCellPaintイベント内のContentRect長方形はOnBeforeCellPaint、セルがレンダリングされる場所を変更するためのものです。実際にはノードのサイズは変更されません。そのContentRectオフセットによって、ノードの物理的な位置から、ノードをクリックできる位置からペイントを移動しました。

ノードの高さを調整する方法は?

デフォルトの固定ノードの高さは、DefaultNodeHeightプロパティによって定義されます。必要なノードの高さが事前にわからない場合は、OnMeasureItemイベントのハンドラーを作成できます。そこで、NodeHeightパラメータ値を変更してノードの高さを調整できます。

OnMeasureItemイベントを処理するときは、必ずオプションセットtoVariableNodeHeightにオプションを含めてください。TreeOptions.MiscOptions

ノード幅を調整する方法は?

特にTVirtualStringTree制御の場合、ノード幅は、測定されたノードテキスト幅を2 *テキストマージン(TextMarginプロパティで調整可能)だけ増やして計算されます。ノードのテキスト幅の測定中に、測定されたテキスト幅を含むOnMeasureTextWidth宣言されExtentたパラメーターを使用してイベントが発生します。このExtentパラメータを変更すると、このイベントはこの目的のためだけに内部的に使用されるため、ノードの全体的な幅に影響を与えます。

したがって、各ノードの幅をたとえば20ピクセル増やすには、次のように記述します。

procedure TForm1.VirtualStringTree1MeasureTextWidth(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  const Text: string; var Extent: Integer);
begin
  Extent := Extent + 20;
end;

テキストエクステントを変更しない場合と変更した場合の結果は次のとおりです。

ここに画像の説明を入力してください

制御のためTVirtualDrawTreeに状況ははるかに簡単です。宣言されたパラメータOnGetNodeWidthを介してノード幅を指定するために使用されるイベントがあります。NodeWidth

于 2012-12-11T18:01:27.420 に答える