0

仮想ツリー コンポーネントのノードごとに 2 つの異なるアイコンを格納およびロードする方法を知る必要があります。2 つのアイコンのサイズも異なります。

ありがとう

4

2 に答える 2

4

全体を所有者が描画するつもりでない限り、私が知っているコントロールは異種のアイコンサイズをサポートしていません.Virtual Treeviewが含まれています。特定のビューのすべてのアイコンは 1 つのTImageListコントロールから取得され、一度TImageListに 1 つの画像サイズのみをサポートします。

画像サイズを大きい方のアイコンのサイズにしてから、小さい方のアイコンを大きい方のアイコンの上にペイントすると、たまたま透明な境界線がパディングされます。

一度に 1 つのアイコン サイズのみをサポートする必要がある場合は、2 つの個別のTImageListコントロールを維持できます。サイズを切り替えたい場合は、ツリー コントロールのImageListプロパティを再割り当てします。DefaultNodeHeightまた、既存のすべてのノードの高さとともに、プロパティを調整する必要がある場合もあります。

于 2009-09-28T04:24:37.120 に答える
0

これは、TPngImageList を使用して機能します。この実装は標準の TImageList で動作するはずですが、png 画像を使用する方が適切です。

この例では、フォーム クラス名は「TfPrj」、TvirtualStringTree インスタンス名は「vPrj」、TMyDataRecord はデータを取得するレコード構造です。

  1. フォームには、16x16 の標準アイコンが設定された TPngImageList にリンクされた TVirtualStringTree があります。しかし、いくつかのノードに 64x64 アイコン セットを使用したいとします。
  2. iLarge と呼ばれる 64x64 アイコン セットで TPngImageList を作成します。
  3. このようなカスタム図面をコードで管理します。

    var
      p: TMyDataRecord;
    
    const
      riskImagesSize=64;
      riskImagesPadding=2;
    
    procedure FindP(Node: PVirtualNode);
    begin
      // This procedure fill in the "p" record with your tree data for the node.
    end;
    
    procedure TfPrj.vPrjMeasureItem(Sender: TBaseVirtualTree; TargetCanvas: TCanvas;
      Node: PVirtualNode; var NodeHeight: Integer);
    begin
      FindP(Node);
      if p<>nil then
        if p.LargeImages then
          NodeHeight := riskImagesSize+riskImagesPadding*2;
    
    end;
    
    procedure TfPrj.vPrjBeforeCellPaint(Sender: TBaseVirtualTree;
      TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
      CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
    begin
      if Column=0 then begin
        FindP(Node);
        if p<>nil then begin
          if p.LargeImages then begin
            Inc(ContentRect.Left,riskImagesSize);
        end;
      end;
    end;
    
    
    procedure TfPrj.vPrjDrawText(Sender: TBaseVirtualTree; TargetCanvas: TCanvas;
      Node: PVirtualNode; Column: TColumnIndex; const Text: string;
      const CellRect: TRect; var DefaultDraw: Boolean);
    var
      i: integer;
      s: string;
    begin
      FindP(Node);
      if Column=0 then
        if p<>nil then
          if p.LargeImages then begin
            iLarge.Draw(TargetCanvas,CellRect.Left-riskImagesSize-riskImagesPadding*2,CellRect.Top+riskImagesPadding,p.LargeImagesIndex);
          end;
    end;
    
    procedure TfPrj.vPrjGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode;
      Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean;
      var ImageIndex: Integer);
    begin
      if Column<>0 then
        Exit;
      FindP(Node);
      if p.LargeImages then
        ImageIndex=-1
      else
        // Assign the image index for standard TPngImageList
    
    end;
    
于 2014-06-14T16:52:31.407 に答える