在Delphi中使用系统对应文件类型的图标

在应用程序的编写中,组合框(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/blogpro/p/11453599.html

时间: 2024-10-01 14:12:07

在Delphi中使用系统对应文件类型的图标的相关文章

delphi 动态获取文件类型的图标

delphi 动态获取文件类型的图标.txt我不奢望什么,只希望你以后的女人一个不如一个.真怀念小时候啊,天热的时候我也可以像男人一样光膀子!在应用程序的编写中,组合框(ComboBox).列表框(ListBox).等常见的部件,通常不仅要用于显示文字,而且还要显示其与文字相关的图标.在一般的Windows应用程序中,这些图标的显示都要随列出的显示文本的变化而变化,例如在组合框中列出当前目录下的所有文件时,在组合框左边就显示与文件名相关联的图标,这就是所谓的动态图标.在 Delphi中使用动态图

Linux 中的七种文件类型

LINUX中的七种文件类型d  目录文件.l  符号链接(指向另一个文件,类似于瘟下的快捷方式).s  套接字文件.b  块设备文件,二进制文件.c  字符设备文件.p  命名管道文件.-  普通文件,或更准确地说,不属于以上几种类型的文件

UNIX系统的文件类型

普通文件(regular file).这是最常用的文件类型,这种文件包含了某种形式的数据.至于这种数据是文本还是二进制数据,对于UNIX内核而言并无区别.对普通文件内容的解释由处理该文件的应用程序进行. 目录文件(directory file).这种文件包含了其他文件的名字以及指向与这些文件有关信息的指针.对一个目录文件具有读权限的任一进程都可以读该目录的内容,但只有内核可以直接写目录文件.进程必须使用相应的函数才能更改目录. 块特殊文件(block special file).这种类型的文件提

Linux 系统的文件类型

Linux文件类型常见:普通文件.目录文件.字符设备文件和块设备文件.符号链接文件 1.1. 普通文件(-) ls -lh 来查看某个文件的属性,可以看到有类似-rwxrwxrwx,值得注意的是第一个符号是 - ,这样的文件在Linux中就是普通文件 1>. 纯文本档(ASCII): 这是Linux系统中最多的一种文件类型,称为纯文本档是因为内容为我们人类可以直接读到的数据,例如数字.字母等等. 几乎只要我们可以用来做为设定的文件都属于这一种文件类型. 举例来说,你可以用命令: cat ~/.b

Eclipse中如何进行新文件类型(File types)的关联识别?

这段时间,由于项目需要,采用.btl文件类型代替.jsp文件类型进行前后端的页面交互,但是eclipse又不能识别.btl文件类型.所以需要进行如下操作: 1.Window  ->Preference ->搜索File ->File Associations 2.File type 下添加文件类型(如:Add ->.btl) 3.在第六步之后,继续 4.保存之后,返回界面看.btl文件,已经被Eclipse以.jsp的方式被识别.

Linux中的系统挂载文件/etc/fstab

[[email protected] ~]# cat /etc/fstab ## /etc/fstab# Created by anaconda on Wed Oct 5 15:21:46 2016## Accessible filesystems, by reference, are maintained under '/dev/disk'# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info#/d

如何在linux中进行全局按文件类型搜索

结合find命令和grep 首先利用find命令过滤出指定类型的文件,下面的例子是查找 "*.c" 和 "*.h" 文件. </pre><pre name="code" class="plain">find . -regex ".*\.\(h\|c\)" 然后将记过 find . -regex ".*\.\(h\|c\)" | xargs grep -Inwr &

delphi中如何实现模糊查找文件

procedure   GetFilenames(sPath,   sFilename:   String;     AList:   TStrings);//功能描述:   列出sPath目录中(不含子目录)所有文件名符合sFilename规则的文件名//入口参数://     sPath           -   目录路径//     sFilename   -   文件名//出口参数://     AList           -   sPath目录中所有符合的文件名被添加到了这一列表

Python中实现从目录中过滤出指定文件类型的文件

摘自:http://www.jb51.net/article/60641.htm #!/usr/bin/env python import glob import os os.chdir(“./”) for file in glob.glob(“*.py”): print file print “#######Another One##########” for file in os.listdir(“./”): if file.endswith(“.py”): print file print