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

问题描述 投票:-1回答:1

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

image

delphi
1个回答
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中的大项目。

© www.soinside.com 2019 - 2024. All rights reserved.