带有delphi虚拟树组件的动态图标

我需要知道如何为虚拟树组件中的每个节点存储和加载两个不同的图标,并且这两个图标的大小也不相同

谢谢


除非你要自己绘制整个东西,否则我不知道支持异构图标大小的控制,包括Virtual Treeview。 给定视图的所有图标都来自单个TImageList控件, TImageList只支持一个图像大小。

通过将图像大小设置为较大图标的大小,可以使图标显示为不同的大小,然后将较小的图标绘制到碰巧用透明边框填充的大图标上。

如果您只需要一次支持一个图标大小,则可以维护两个独立的TImageList控件。 如果要切换大小,请重新分配树控件的ImageList属性。 您可能还需要调整DefaultNodeHeight属性以及所有已存在的节点的高度。


这对我使用TPngImageList。 我认为这个实现应该与标准的TImageList一起工作,但使用PNG图像是一个更好的选择。

在这个例子中,表单类名称是“TfPrj”,TvirtualStringTree实例名称是“vPrj”,而TMyDataRecord是您获取数据的记录结构。

  • 你的窗体有一个TVirtualStringTree链接到一个带有16x16标准图标的TPngImageList。 但是您想要为某些节点使用64x64图标集。
  • 使用64x64图标集创建您的TPngImageList,称为iLarge。
  • 在你的代码中,像这样管理一个自定义绘图。

    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;
    
  • 链接地址: http://www.djcxy.com/p/35007.html

    上一篇: dynamic icons with the virtual tree component for delphi

    下一篇: Is it possible to have multiple header rows in a virtual string tree?