如何操作一个系统的ImageList?(200分)

  • 主题发起人 主题发起人 kindly
  • 开始时间 开始时间
K

kindly

Unregistered / Unconfirmed
GUEST, unregistred user!
我用SHGetFileInfo获得了一个系统imagelist的句柄,然后可以根据文件得到它的图标,但是每次<br>得到的图标都会加入到ImageList中去,GDI资源不能释放,我试图用imagelist.clear,但是clear<br>之后就会出错了,再次调用ShGetFileInfo就不能获得图标了,很奇怪的问题,不知有没有人遇到过,<br>盼答!
 
我不太懂你的意思,但我这儿有一遍相关的内容,供你参考:<br><br><br>大量的图标显示是Windows中的一大特色,丰富多彩的图标不仅美化了Windows的桌面,而且便于直观的操作,给用户带来了极大的方便。可以说在某种程度上,图标的地位已经超过了文件名的作用。 <br><br>但是,当我们用可视化编程工具进行Windows编程时,却很少有方便的方法来加载和显示图标。一般来说,在我们的应用程序中使用到图标资源时都是我们自己亲自绘制出来的。因此,在我们编的程序中使用到的图标是很有限的。我们知道Windows中有大量已知的系统图标,如文件夹的图标、磁盘驱动器的图标等等。熟悉Windows编程的朋友也许知道这些图标在Windows内部是有其特定的编号的,只要获取了这些编号就能够调用并显示对应的图标了。通过比较,我选择了Delphi中的ListView组件来显示图标,因为这种方法是最简单的。 <br><br>下面是一个例子,该程序在Delphi 4.0中编译通过。 <br><br>该演示程序可以显示各类Windows系统图标,包括文件图标、磁盘图标、文件夹图标、用户特定可执行文件图标(如:Delphi的火炬图标等等)。有趣的是,我们显示的这些图标没有一个需要我们自己亲自动手绘制。 <br><br>请先在Delphi环境下建立一个窗体Form1,并在Form1中添加一个按钮Button1和一个列表框ListView1;然后请设置ListView1的属性ViewStyle为vsIcon。 <br><br>最后不要忘了在“Object Inspector”中对事件处理过程赋予相应的方法。 <br><br><br>源程序清单: <br><br>unit Unit1; <br><br>interface <br><br>uses Windows, Messages, SysUtils, <br>&nbsp; &nbsp; &nbsp;Classes, Graphics, Controls, <br>&nbsp; &nbsp; &nbsp;Forms, Dialogs, ComCtrls, <br>&nbsp; &nbsp; &nbsp;StdCtrls, ShellAPI, ExtCtrls,ImgList; <br>&nbsp; type <br>&nbsp; &nbsp; TForm1 = class(TForm) <br>&nbsp; &nbsp; &nbsp; ListView1: TListView; <br>&nbsp; &nbsp; &nbsp; Button1: TButton; <br><br>&nbsp; &nbsp; &nbsp; procedure FormDestroy(Sender: TObject); <br>&nbsp; &nbsp; &nbsp; procedure FormCreate(Sender: TObject); <br>&nbsp; &nbsp; &nbsp; procedure Button1Click(Sender: TObject); <br><br>&nbsp; &nbsp; &nbsp; private <br>&nbsp; &nbsp; &nbsp; &nbsp; { Private declarations } <br>&nbsp; &nbsp; &nbsp; public <br>&nbsp; &nbsp; &nbsp; &nbsp; { Public declarations } <br>&nbsp; &nbsp; end; <br><br>const <br><br>Test='C:/'; <br>{ Test为测试数据,在本例中返回的是一个驱动器图标。<br>读者可以自行选择其他测试数据如:<br>Test:='C:/Autoexec.bat' 等等。} <br><br>var <br>&nbsp; Form1: TForm1; <br>&nbsp; ShFileInfo: TSHFILEINFO; <br><br>implementation <br><br>{$R *.DFM} <br><br>function GetFileIconIndex(FileName:string):integer; <br>{ 获取图标的序号函数 } <br>var <br>&nbsp; Ext:String; <br>begin <br>&nbsp; Ext:=FileName; <br>&nbsp; ShGetFileInfo(Pchar(Ext), 0, SHFileInfo,<br>&nbsp; &nbsp; SizeOf(SHFileInfo), SHGFI_LARGEICON or <br>&nbsp; &nbsp; SHGFI_SYSICONINDEX or SHGFI_TYPENAME); <br>&nbsp; Result:=SHFileInfo.iIcon; <br>&nbsp; {返回获取的图标序号 } <br>end; <br><br>procedure TForm1.FormCreate(Sender: TObject); <br>begin <br>&nbsp; with ListView1 do <br>&nbsp; begin <br>&nbsp; &nbsp; SmallImages:=TImageList.CreateSize(32,32); <br>&nbsp; &nbsp; SmallImages.ShareImages:=True; <br>&nbsp; &nbsp; SmallImages.Handle:=ShGetFileInfo('*.*',0, <br>&nbsp; &nbsp; &nbsp; SHFileInfo, SizeOf(SHFileInfo), <br>&nbsp; &nbsp; &nbsp; SHGFI_LARGEICON or <br>&nbsp; &nbsp; &nbsp; SHGFI_ICON or SHGFI_SYSICONINDEX); <br><br>&nbsp; &nbsp; LargeImages:=TImageList.CreateSize(32,32); <br>&nbsp; &nbsp; LargeImages.ShareImages:=True; <br>&nbsp; &nbsp; LargeImages.Handle:=ShGetFileInfo('*.*',0, <br>&nbsp; &nbsp; &nbsp; SHFileInfo, SizeOf(SHFileInfo), <br>&nbsp; &nbsp; &nbsp; SHGFI_LARGEICON or <br>&nbsp; &nbsp; &nbsp; SHGFI_ICON or SHGFI_SYSICONINDEX); <br>&nbsp; end;<br>&nbsp; {分配系统资源给ListView1组件以显示图标 } <br>end; <br><br>procedure TForm1.FormDestroy(Sender: TObject); <br>begin <br>&nbsp; ListView1.SmallImages.Free; <br>&nbsp; ListView1.LargeImages.Free; <br>&nbsp; {释放ListView1占用的系统资源 } <br>end; <br><br>procedure TForm1.Button1Click(Sender: TObject); <br>begin <br>&nbsp; ListView1.Items.Item[0]. <br>&nbsp; ImageIndex:=GetFileIconIndex(Test); <br>&nbsp; {为ListView1中的第一个项目绘制图标 } <br>end; <br><br>end. <br><br>以下程序在列表框中显示所有系统图标<br>procedure TForm1.Button3Click(Sender: TObject);<br>var i:integer;<br>begin<br>&nbsp; with listview1 do<br>&nbsp; begin<br>&nbsp; &nbsp; items.clear;<br>&nbsp; &nbsp; for i :=0 &nbsp;to smallimages.count-1 do<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; items.add;<br>&nbsp; &nbsp; &nbsp; items.caption:=inttostr(i);<br>&nbsp; &nbsp; &nbsp; items.imageindex:=i;<br>&nbsp; &nbsp; end;<br>&nbsp; end;<br>end;<br><br>
 
谢谢你的回答,不过你的代码我早已写过了,我想问的是如果ImageList已经有了某文件的图标<br>,再次调用SHGetFIleInfo仍然会重新获得一个图标的Handle,可以写一下代码测试一下,就是不断的<br>重复取一个文件的图标信息,每次都会获得一个图标的句柄,但是我无法释放它<br>for i:=0 to imagelist.count -1 do<br>begin<br>&nbsp; &nbsp; imagelist.getIcon(handle,aicon); //这里就会出错了<br>end;<br>我后来想了个办法解决了这个问题,但感觉不是太好,有相关经验的朋友帮忙
 
后退
顶部