在Delphi中显示Windows图标

 

    大量的图标显示是Windows 的一大特色。丰富多彩的图标不仅美化了Windows 的桌面,而且便于直观操作,给用户带来了极大的方便。但是,当我们用可视化编程工具进行编程时,却很少有方便的办法加载和显示图标。
  编程思路
  Windows 中有大量已知的系统图标,如文件夹的图标、磁盘驱动器的图标等等。熟悉Windows 编程的朋友也许知道这些图标在Windows 内部都有其特定的编号,通过获取这些编号就能方便地调用并显示对应的图标。通过比较,我认为利用Delphi 中的ListView 组件显示图标的方法最简单。
  下面是一个可以显示各类Windows系统图标,包括文件图标、磁盘图标、文件夹图标及用户特定可执行文件图标(如:Delphi 的火炬图标等等)的例子,令人高兴的是,通过这种方法显示的图标无须我们亲手绘制。
  在Delphi 环境下建立一个窗体Form1,并在Form1中添加一个按钮But—ton1和一个列表框ListView1;然后设置ListView1的属性ViewStyle 为vsIcon。
  源程序清单unit Unit1;
interface
uses Windows ,Messages ,SysUtils ,Classes ,
Graphics ,Controls ,
Forms ,Dialogs ,ComCtrls ,StdCtrls ,Shel—lAPI ,ExtCtrls ,
ImgList ;
type
TForm1=class(TForm)
ListView1:TListView;
Button1:TButton ;
procedure FormDestroy(Sender :TOb—
ject);procedure FormCreate(Sender :TObject);
procedure Button1Click(Sender :TOb—
ject);
private {Private declarations }
public {Public declarations }
end ;
const
Test =′C:\′;
{Test 为测试数据,在本例中返回的是
一个驱动器图标。读者可以自行选择其
他测试数据如:Test :=′C:\Autoexec .bat′
等等。}
var Form1:TForm1;
ShFileInfo :TSHFILEINFO;
i mplementation
{$R *.DFM}function GetFileIconIndex(FileName :string):
integer ;
{获取图标的序号函数}
var Ext :String ;
begin
Ext :=FileName ;
Result :=ShGetFileInfo(PChar(Ext),0,
SHFileInfo ,
SizeOf(SHFileInfo),SHGFI_LARGEICON or
SHGFI_SYSICONINDEX or SHG—
FI_TYPENAME);
Result :=SHFileInfo .iIcon ;
{返回获取的图标序号}
end ;
procedure TForm1.FormCreate(Sender :TOb—
ject);
begin
with ListView1do
begin SmallImages :=TImageList .CreateSize
(32,32);SmallImages .ShareImages :=True ;
SmallImages .Handle :=ShGetFileInfo(′*
.*′,0,SHFileInfo ,SizeOf(SHFileInfo),
SHGFI_LARGEICON or SHGFI_ICON or SHG—
FI_SYSICONINDEX);
LargeImages :=TImage—
List .CreateSize(32,32);
LargeImages .ShareImages :=True ;
LargeImages .Handle :=ShGetFile—
Info(′*.*′,0,
SHFileInfo ,SizeOf(SHFileInfo),
SHGFI_LARGEICON or
SHGFI_ICONorSHG—
FI_SYSICONINDEX);
end ;
{分配系统资源给ListView1组件以显
示图标}
end ;
procedure TForm1.FormDestroy(Sender :TO—
bject);
begin
ListView1.SmallImages .Free ;
ListView1.LargeImages .Free ;
{释放ListView1占用的系统资源}
end ;
procedure TForm1.Button1Click(Sender :
TObject);
begin
ListView1.Items .Item[0].ImageIndex:=
GetFileIconIndex(Test);
{为ListView1中的第一个项目绘制图
标}
end ;
(湖北华中师大计科系end .江立430079)