delphi - 当 ViewStyle 为 vsIcon 时如何使用 OnDrawItem 事件自定义绘制 ListView
解决方案
TListView
只有仔细阅读帮助资源,才能以自定义方式绘制内容。
下图是代码运行的结果。附在这张图片之后的代码。附加到的组件的宽度和高度都设置为 24 像素
ImageList1
TListView
这一张图片是相同的TListView
,但没有附加 ImageList。
橙色矩形为选中项
现在转到代码。
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;
您必须被告知 ViewMode 中每个项目的TListView
大小vsIcon
取决于通过属性TImageList
附加到控件的大小。LargeImages
比大图像 - 比中的大项目TListView
。
推荐阅读
- arrays - 如何在 JavaScript 中获取键对象的键
- python - 用python将没有时间的日期解析到mysql中
- c++ - 如何在cpp中处理stringstream中的空格?
- android - 从另一个活动返回后 MainActivity 未恢复
- sql - SQL ORDER BY 行数?
- java - habarta typescript 插件无法加载类
- python - 如何使用字典替换 Pandas 系列中的多个子字符串?
- ios - 即使互联网不可用也进行 API 调用
- node.js - axios 没有实现 post 请求
- javascript - 如何在 React 中使背景图像每 X 秒更改一次?