ViewStyle为vsIcon时如何使用OnDrawItem事件自定义绘制ListView

时间:2018-09-15 23:36:53

标签: delphi

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

image

1 个答案:

答案 0 :(得分:1)

只有仔细阅读帮助资源,您才能以自定义的方式绘制TListView的内容。
下图是代码运行的结果。此图片后附的代码。
enter image description here
连接到ImageList1的组件TListView的宽度和高度均设置为24像素

这张图片是相同的TListView,但没有附加的ImageList。
enter image description here

橙色矩形是一个选定的项目

现在转到代码。

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;

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