1

グラフィックスをノード イメージとして描画する必要があります。OnGetImageIndex イベントで ImageList から画像を描画するように、TIcon、TImage、TBitmap などの単一のソースから画像を描画します。

私の状況では、すべてのノードに独自のアイコンと UserData レコード内の場所があります。

これらのアイコンをノードに描画するにはどうすればよいですか?

ここでこのコードを見つけて、自分の状況に合わせて調整しようとしました:

procedure TForm10.Button1Click(Sender: TObject);
var
  Node: PVirtualNode;
begin
  VirtualStringTree1.AddChild(nil);
  Node := VirtualStringTree1.AddChild(nil);
  VirtualStringTree1.AddChild(Node);
  Node := VirtualStringTree1.AddChild(Node);
  VirtualStringTree1.AddChild(Node);
  VirtualStringTree1.AddChild(Node);
  VirtualStringTree1.AddChild(Node);
end;

procedure TForm10.VirtualStringTree1AfterItemPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; ItemRect: TRect);
var
  rImage: TRect;
  OffsetLeft: Integer;
  Icon: TIcon;
begin
  rImage := ItemRect;
  Icon := TIcon.Create;
  Icon.LoadFromFile('TestIcon_16.ico');
  with TVirtualStringTree(Sender) do
  begin
    if (toShowRoot in TreeOptions.PaintOptions) then
      OffsetLeft := Indent * (GetNodeLevel(Node) + 1)
    else
      OffsetLeft := Indent * GetNodeLevel(Node);

    Inc(rImage.Left, Margin + OffsetLeft);
    Inc(rImage.Top, (NodeHeight[Node] - Icon.Height) div 2);
    rImage.Right := rImage.Left + Icon.Width;
    rImage.Bottom := rImage.Top + Icon.Height;
  end;
  DrawIcon(TargetCanvas.Handle, rImage.Left, rImage.Top, Icon.Handle);
end;

ボタンをクリックすると、次のことがわかります。 ここに画像の説明を入力

なぜそれが起こるのですか?アイコンサイズ 100% - 16 x 16 ピクセル。

テキストの描画に関する問題はどこで解決できますか?

私は何を間違っていますか?

4

1 に答える 1

0

残念ながら、VT はイメージ リストに依存しており、個別のイメージを使用することはできません。同時に、アイテムの挿入と削除に関する限り、画像リストは不便です。OnGetImageExしたがって、回避策として、各画像の画像リストを作成し、イベント ハンドラーを介して VT に返すことができます。

または、VT が画像のサイズを認識し、AfterPaint で独自のカスタム画像をペイントできるように、空の透明な画像を 1 つ含むダミーの画像リストを 1 つ作成することもできます。

于 2014-11-05T14:49:00.467 に答える