[英]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提出的解決方案之后,在調整組件的大小之后存在處理重繪事件的嚴重問題,因此最后我提出了兩種可能的解決方法:
由於子項目是字符串,因此我更改了字體系列,並使用Wingdings使用了類似三角形的字符,因此我只是更改了字體顏色以使其看起來像字形。 (我知道這不是很干凈,但是從時間和精力的角度來看,它對我有用)
從一開始就使用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.