簡體   English   中英

如何在 Delphi 中的 TListView 子項上繪制 bmp/圖標?

[英]How to draw a bmp/icon on a TListView subitem in Delphi?

我想使用 delphi 將圖標/bmp 繪制到 TListView 的子項中。但我不知道如何實現。 它適用於列表中的第一項,但子項有問題。

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

使用TImageList組件保存圖像,將其分配給listviews的SmallImages屬性並設置子項的ImageIndex。

在嘗試了Gamecat提出的解決方案之后,在調整組件的大小之后存在處理重繪事件的嚴重問題,因此最后我提出了兩種可能的解決方法:

  1. 由於子項目是字符串,因此我更改了字體系列,並使用Wingdings使用了類似三角形的字符,因此我只是更改了字體顏色以使其看起來像字形。 (我知道這不是很干凈,但是從時間和精力的角度來看,它對我有用)

  2. 從一開始就使用TDataGrid,它了解單元格的概念,我們幾乎可以添加任何內容,而不必擔心重繪事件。 (對我沒用,因為現有組件已經具有很多功能)。

好的,晚了 13 年,但這是獲得界限的一種干凈方式。

uses Winapi.CommCtrl;

...

procedure TFrmMain.ListView1(
  Sender: TCustomListView;
  Item: TListItem; 
  SubItem: integer; 
  State: TCustomDrawState;
  var DefaultDraw: Boolean);    
var
  lv: TListView absolute Sender;
  SubItemRect: TRect;
begin
  ListView_GetSubItemRect(lv.Handle, Item.Index, SubItem, LVIR_BOUNDS, @SubItemRect);

  // Now you know the boundaries of the sub item...

  // So you could do something like:
  lv.Canvas.Draw(SubItemRect.Left, SubItemRect.Top, MyBitmap);

end;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM