取得含程序图标的程序列表时,一般的思路都是将图标用 API函数SHGetFileInfo获取图标ico句柄,并加载到imagelist中,供Listview调用,这样固然可以出效果:
但看着图标毛刺儿一样的黑边儿心里很不爽,网上搜了一番,有反映是imagelist的问题,那么就试着直接把图标绑定到Listview上:
首先要自己写一个小图标集:
uses ShellApi,CommCtrl
...
var S_ImageListHandle: THandle;//小图标集句柄
FileInfo: SHFILEINFO;
...
//绑定图标集
S_ImageListHandle := SHGetFileInfo(PChar('C:\'),0,FileInfo,
SizeOf(FileInfo),SHGFI_SYSICONINDEX or SHGFI_SMALLICON);//取得小图标集句柄
SendMessage(Listview1.Handle,LVM_SETIMAGELIST,LVSIL_SMALL,S_ImageListHandle);//将小图标集句柄指给列表
这样就绑定了一个图标集给listview(相关参数解释请查询MSDN)。
在程序中循环输出列表的时候:
with ListView1.Items.Add do
begin
if SHGetFileInfo(PChar('程序路径'),0,FileInfo,
SizeOf(FileInfo),SHGFI_SYSICONINDEX or SHGFI_SMALLICON) <> 0 then//取得小图标集句柄
ImageIndex := FileInfo.iIcon
else ImageIndex := -1;
Caption := '程序名';
SubItems.Add('其他内容');
end;
这样就可以了。看改良后的效果:




