delphi 动态获取文件类型的图标.txt我不奢望什么,只但愿你之后的女人一个不如一个。真怀念小时候啊,天热的时候我也能够像男人同样光膀子!在应用程序的编写中,组合框(ComboBox)、列表框(ListBox)、等常见的部件,一般不只要用于显示文字,并且还要显示其与文字相关的图标。在通常的Windows应用程序中,这些图标的显示都要随列出的显示文本的变化而变化,例如在组合框中列出当前目录下的全部文件时,在组合框左边就显示与文件名相关联的图标,这就是所谓的动态图标。在 Delphi中使用动态图标的步骤以下:编程
1、图标的获取
要使用动态图标,首先要解决的是如何得到显示文本和与其相关联的图标句柄。该图标经过文件关联由系统注册表决定,而且在Windows编程中同一文件 (或子目录,或文件夹)在桌面上也可能有两种显示结果,这就是DOS文件名与显示名(Display Name)。若是咱们的应用程序不须要有像Windows资源浏览器那样的效果,则可使用FindFirst()和FindNext()二个函数以及 FindClose()过程来得到DOS文件名,不然咱们就应当使用WindowsAPI来得到显示名。在得到文件名的同时可经过使用 ShellAPI.pas中的SHGetFileInfo()函数来得到其图标句柄HICON,说明以下:
function SHGetFileInfo(pszPath: PAnsiChar; dwFileAttributes: DWORD;var psfi: TSHFileInfo; cbFileInfo,uFlags: UINT): DWORDl;
pszPath 参数:指定的文件名。当uFlags的取值中不包含 SHGFI_PIDL时,可直接指定;不然pszPath要经过计算得到,不能直接指定;
dwFileAttributes参数:文件属性,仅当uFlags的取值中包含SHGFI_USEFILEATTRIBUTES时有效,通常不用此参数;
psfi 参数:返回得到的文件信息,是一个记录类型,有如下字段:
hIcon: HICON; //文件的图标句柄
iIcon: Integer; //图标的系统索引号
dwAttributes: DWORD; //文件的属性值
szDisplayName: array [0..MAX_PATH-1] of AnsiChar; //文件的显示名
szTypeName: array [0..79] of AnsiChar; //文件的类型名
cbFileInfo 参数:psfi的比特值;
uFlags 参数:指明须要返回的文件信息标识符,经常使用的有如下常数:
SHGFI_ICON; //得到图标
SHGFI_DISPLAYNAME; //得到显示名
SHGFI_TYPENAME; //得到类型名
SHGFI_ATTRIBUTES;//得到属性
SHGFI_LARGEICON; //得到大图标
SHGFI_SMALLICON; //得到小图标
SHGFI_PIDL;// pszPath是一个标识符
函数SHGetFileInfo()的返回值也随uFlags的取值变化而有所不一样。经过调用SHGetFileInfo()能够由psfi参数获得文件的图标句柄,但要注意在uFlags参数中不使用SHGFI_PIDL时,SHGetFileInfo()不能得到"个人电脑"等虚似文件夹的信息。浏览器
2、图标的加载
使用Delphi提供的TImageList组件,经过调用CommCtrl .pas中的函数ImageList_AddIcon()来加载获得的图标,并要保证其索引号与显示文本相对应。说明以下:
function ImageList_AddIcon(ImageList: HIMAGELIST; //加载图标的ImageList句柄
Icon: Hicon //加载的图标句柄 ): Integer; //返回图标在ImageList中的索引号
在须要指明图标索引号时可以使用ImageList_AddIcon()的返回值。app
3、图标和文本的绘图式输出
对于组合框、列表框等不能直接显示图标的组件,因为要求显示图标的同时又要同时显示文本,可经过设置其相应的Style属性达到目的,示例以下:
组合框:ComboBox1.Style:=csOwnerDrawVariable根据实际使用经验最好不要在ObjectInspector窗体中直接设置,而应将代码添加在程序的适当位置,不然可能出现绘图区域高度不规则变化
列表框:ListBox1.Style:=lbOwnerDrawVariable
状态栏:StatusBar1.Panels[i].Style:= psOwnerDraw 不能使用简单状态栏,i是状态栏中要绘制图标的某一窗格索引号,图形输出可以使用TImageList的ImageList1.Draw()方法,而文本输出则可以使用TCanvas的TextOut()方法,它由组件的Canvas属性继承获得,显然没有Canvas属性的组件不能使用此方法显示图标。
对于可直接显示图标的组件,直接指定其Images、StateImages等须要的图标属性为相应的TimageList组件名,并经过指定图标的索引号则可显示图标。须要注意的是:在使用大图标时,必须先调用TImageList的CreateSize()方法指定可加载图标的尺寸,而且在每次调用 TImageList的Clear方法后都要从新调用CreateSize()。
使用TImageList的ImageList1.Clear方法清除已加载的图标,常在须要刷新时使用。 函数
这种方法只是取扩展名所示文件的图标,彻底彻底不须要文件存在!!!!orm
procedure TForm1.FormCreate(Sender: TObject);
var
FileInfo: TSHFileInfo;
begin
//取得小图标集句柄
S_ImageListHandle := SHGetFileInfo('C:\',0,FileInfo,
SizeOf(FileInfo),SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
//将小图标集句柄指给列表
SendMessage(Listview1.Handle, LVM_SETIMAGELIST, LVSIL_SMALL, S_ImageListHandle);
end;继承
使用的时候:
ListItem:=ListView1.Items.Add;
FillChar(FileInfo, SizeOf(FileInfo), #0);
if Ty='<DIR>' then //取目录图标
SHGetFileInfo(Pchar(extractfilepath(application.ExeName )),0,FileInfo,sizeof(FileInfo),
SHGFI_SYSICONINDEX or SHGFI_SMALLICON)
else//取文件图标
SHGetFileInfo(Pchar(N),0,FileInfo,sizeof(FileInfo),
SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES or SHGFI_SMALLICON);
ListItem.ImageIndex :=FileInfo.iIcon ;
里面有些变量是个人局部变量,你看一下意思就OK了 索引