如何在Delphi中的TListView子项上绘制bmp /图标?

时间:2009-04-02 15:31:54

标签: delphi listview

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

3 个答案:

答案 0 :(得分:5)

您可以使用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;

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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