【问题标题】:How to draw a bmp/icon on a TListView subitem in Delphi?如何在 Delphi 的 TListView 子项上绘制 bmp/图标?
【发布时间】:2009-04-02 15:31:54
【问题描述】:

我想使用 delphi 将图标/bmp 绘制到 TListView 的子项中。但我不知道如何做到这一点。它适用于列表中的第一项,但子项有问题。

【问题讨论】:

    标签: delphi listview


    【解决方案1】:

    您可以使用 CustomDrawSubItem 事件。

    下面的示例忽略文本并绘制​​矩形。不幸的是,为右列获取矩形有点麻烦,但这种方法有效:

    procedure TForm.ListViewCustomDrawSubItem(Sender: TCustomListView;
      Item: TListItem; SubItem: Integer; State: TCustomDrawState;
      var DefaultDraw: Boolean);
    var
      r : TRect;
      i : Integer;
    begin
      r := Item.DisplayRect(drBounds);
      for i := 0 to SubItem-1 do begin
        r.Left := r.Left + ListView.Columns.Items[i].Width;
        r.Right := r.Left  + ListView.Columns.Items[i+1].Width;
      end;
      case SubItem of
         1 : ListView.Canvas.Pen.Color := clRed;
      else
        ListView.Canvas.Pen.Color := clBlue;
      end;
    
      ListView.Canvas.Rectangle(r.Left, r.Top, r.Right, r.Bottom);
      DefaultDraw := False;
    end;
    

    【讨论】:

    • 谢谢,我试过了,它部分工作。可以在子项内绘制任何内容,但是在调整大小或移动组件(TListView)后绘制列时出现问题。
    【解决方案2】:

    使用 TImageList 组件来保存您的图像,将其分配给列表视图的 SmallImages 属性并设置子项的 ImageIndex。

    【讨论】:

    • 他说的是 LIST 视图,而不是 TREE 视图。列表视图的子项构成其他数据列,Windows 列表视图只接受主列上的图标。
    • 感谢您的回答。正如 TOndrej 所说我正在使用 TListView 组件,一个小限制是我必须在 Delphi 4 上执行此操作。是的,它已经存在! :)
    【解决方案3】:

    在尝试了Gamecat提出的解决方案后,在调整组件大小后处理重绘事件存在严重问题,所以最后我想出了2个可能的解决方法:

    1. 由于子项是字符串,因此我处理了更改字体系列并使用 Wingdings 使用了类似三角形的字符,然后我只是更改了字体颜色以使其看起来像字形。 (我知道,它不是很干净,但从时间和精力的角度来看,它对我有用)

    2. 从一开始就使用 TDataGrid,它知道单元格的概念,我们几乎可以添加任何内容,而无需担心重绘事件。 (对我来说没用,因为现有组件已经构建了很多功能)。

    【讨论】:

      【解决方案4】:

      好吧,迟到了 13 年,但这是获得界限的干净方法。

      uses Winapi.CommCtrl;
      
      ...
      
      procedure TFrmMain.ListView1(
        Sender: TCustomListView;
        Item: TListItem; 
        SubItem: integer; 
        State: TCustomDrawState;
        var DefaultDraw: Boolean);    
      var
        lv: TListView absolute Sender;
        SubItemRect: TRect;
      begin
        ListView_GetSubItemRect(lv.Handle, Item.Index, SubItem, LVIR_BOUNDS, @SubItemRect);
      
        // Now you know the boundaries of the sub item...
      
        // So you could do something like:
        lv.Canvas.Draw(SubItemRect.Left, SubItemRect.Top, MyBitmap);
      
      end;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多