首页 > 解决方案 > 当 ViewStyle 为 vsIcon 时如何使用 OnDrawItem 事件自定义绘制 ListView

问题描述

如何自定义绘制 ListView 使其看起来像这样?

图片

标签: delphi

解决方案


TListView只有仔细阅读帮助资源,才能以自定义方式绘制内容。
下图是代码运行的结果。附在这张图片之后的代码。附加到的组件的宽度和高度都设置为 24 像素
在此处输入图像描述
ImageList1TListView

这一张图片是相同的TListView,但没有附加 ImageList。
在此处输入图像描述

橙色矩形为选中项

现在转到代码。

procedure TForm1.ListView1AdvancedCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage; var DefaultDraw: Boolean);
var
  Bmp: TBitmap;
  Image: TBitmap;
  R: TRect;
  CenterH: Integer;
  CenterV: Integer;
  ImageIndex: Integer;
begin
  R := Item.DisplayRect(drBounds);
  Bmp := TBitmap.Create;
  try
    Image := TBitmap.Create;
    try
      Bmp.SetSize(R.Width, R.Height);

      // Make fill for item
      if Item.Selected then
        Bmp.Canvas.Brush.Color := clWebOrange
      else
        Bmp.Canvas.Brush.Color := clMoneyGreen;
      Bmp.Canvas.FillRect(Bmp.Canvas.ClipRect);

      // Output image associated with current item
      if Assigned(TListView(Sender).LargeImages) then
        begin
          TListView(Sender).LargeImages.GetBitmap(Item.ImageIndex, Image);
          CenterH := (R.Width - Image.Width) div 2;
          CenterV := (R.Height - Image.Height) div 2;
          Bmp.Canvas.Draw(CenterH, CenterV, Image);
        end;

      // Draw ready item's image onto sender's canvas
      Sender.Canvas.Draw(R.Left, R.Top, Bmp);
    finally
      Image.Free;
    end;
  finally
    Bmp.Free;
  end;
end;

您必须被告知 ViewMode 中每个项目的TListView大小vsIcon取决于通过属性TImageList附加到控件的大小。LargeImages比大图像 - 比中的大项目TListView


推荐阅读