【问题标题】:Delphi: how to draw small icons in List View on CustomDrawItemDelphi:如何在 CustomDrawItem 的列表视图中绘制小图标
【发布时间】:2019-07-30 19:22:58
【问题描述】:

如何扩展这段代码:ListView in vsReport mode colouring of Items and rows来绘制小图标?

如果我有 3 列,为什么会出现错误“列表索引超出范围 (2)”?

谢谢!

【问题讨论】:

  • 关于老代码的bug,如果你有3个,第一个存放在Caption,剩下的两个分别存放在Subitems[0]Subitems[1]。跨度>
  • @Andreas Rejbrand,多谢多谢!!!!!!!

标签: delphi listview graphics draw


【解决方案1】:

绘制图标的方法有很多种,具体取决于它们的来源(文件、资源、系统图标等)以及是否应该为所有项目提供一个图标,或者是否每个项目都有它自己的图标。无论如何,从上一个问题中的代码的扩展版本中应该可以清楚总体思路(并且我还修复了越界错误...):

type
  TForm1 = class(TForm)
  ...
  private
    { Private declarations }
    bm: TBitmap;
  ...
  end;

...

implementation

...

procedure TForm1.FormCreate(Sender: TObject);
begin
  bm := TBitmap.Create;
  bm.LoadFromFile('C:\Users\Andreas Rejbrand\Desktop\img.bmp');
end;

procedure TForm1.ListView1DrawItem(Sender: TCustomListView; Item: TListItem;
  Rect: TRect; State: TOwnerDrawState);
var
  i: Integer;
  x1, x2: integer;
  r: TRect;
  S: string;
const
  DT_ALIGN: array[TAlignment] of integer = (DT_LEFT, DT_RIGHT, DT_CENTER);
begin
  if Odd(Item.Index) then
  begin
    Sender.Canvas.Font.Color := clBlack;
    Sender.Canvas.Brush.Color := $F6F6F6;
  end
  else
  begin
    Sender.Canvas.Font.Color := clBlack;
    Sender.Canvas.Brush.Color := clWhite;
  end;
  Sender.Canvas.Brush.Style := bsSolid;
  Sender.Canvas.FillRect(Rect);
  x1 := 0;
  x2 := 0;
  r := Rect;
  Sender.Canvas.Brush.Style := bsClear;
  Sender.Canvas.Draw(3, r.Top + (r.Bottom - r.Top - bm.Height) div 2, bm);
  for i := 0 to ListView1.Columns.Count - 1 do
  begin
    inc(x2, ListView1.Columns[i].Width);
    r.Left := x1;
    r.Right := x2;
    if i = 0 then
    begin
      S := Item.Caption;
      r.Left := bm.Width + 6;
    end
    else
      S := Item.SubItems[i - 1];
    DrawText(Sender.Canvas.Handle,
      S,
      length(S),
      r,
      DT_SINGLELINE or DT_ALIGN[ListView1.Columns[i].Alignment] or
        DT_VCENTER or DT_END_ELLIPSIS);
    x1 := x2;
  end;
end;

【讨论】:

  • 我想我应该为我在 pbrush 中制作的那个很棒的图标获得奖品。
  • TImageList.Draw() 将是在此代码中绘制图像的另一种常用方法
  • @David Heffernan,我可以举个例子吗?
  • 像这样:ImageList3.Draw(listview1.Canvas,x,y,0,true);
  • 一个小问题 - 如果我在 DrawItem 上画一整行:“如果 Item.SubItems[2]='Done' then begin Sender.Canvas.Font.Color := clBlack; Sender .Canvas.Brush.Color := clGreen; end" ????只有 SubItem 被填充。
猜你喜欢
  • 2011-09-13
  • 2011-10-26
  • 2011-02-21
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多