获取文件显示图标

  在应用程序的编写中,组合框(ComboBox)、列表框(ListBox)、等常见的部件,通常不仅要用于显示文字,而且还要显示其与文字相关的图标。在一般的Windows应用程序中,这些图标的显示都要随列出的显示文本的变化而变化,例如在组合框中列出当前目录下的所有文件时,在组合框左边就显示与文件名相关联的图标,这就是所谓的动态图标。在Delphi中使用动态图标的步骤如下:  
    一、图标的获取  
    要使用动态图标,首先要解决的是如何获得显示文本和与其相关联的图标句柄。该图标通过文件关联由系统注册表决定,并且在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()不能获得"我的电脑"等虚似文件夹的信息。  
    二、图标的加载  
    使用Delphi提供的TImageList组件,通过调用CommCtrl   .pas中的函数ImageList_AddIcon()来加载得到的图标,并要保证其索引号与显示文本相对应。说明如下:  
    function   ImageList_AddIcon(ImageList:   HIMAGELIST;   //加载图标的ImageList句柄  
    Icon:   Hicon   //加载的图标句柄   ):   Integer;   //返回图标在ImageList中的索引号  
    在需要指明图标索引号时可使用ImageList_AddIcon()的返回值。  
    三、图标和文本的绘图式输出  
    对于组合框、列表框等不能直接显示图标的组件,由于要求显示图标的同时又要同时显示文本,可通过设置其相应的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方法清除已加载的图标,常在需要刷新时使用。

转载于:https://www.cnblogs.com/zzling/archive/2008/08/05/1260711.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值