教你在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; //获得大图标
// www.bianceng.cn
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方法清除已加载的图标,常在需要刷新时使用。

时间: 2024-10-03 12:19:05

教你在Delphi程序中使用动态图标的相关文章

在Delphi中使用动态图标

在应用程序的编写中,组合框(ComboBox).列表框(ListBox).等常见的部件,通常不仅要用于显示文字,而且还要显示其与文字相关的图标.在一般的Windows应用程序中,这些图标的显示都要随列出的显示文本的变化而变化,例如在组合框中列出当前目录下的所有文件时,在组合框左边就显示与文件名相关联的图标,这就是所谓的动态图标.在Delphi中使用动态图标的步骤如下: 一.图标的获取 要使用动态图标,首先要解决的是如何获得显示文本和与其相关联的图标句柄.该图标通过文件关联由系统注册表决定,并且在

c程序中如何动态创建db2临时表

问题描述 c程序中如何动态创建db2临时表 c程序中如何动态创建db2临时表?因为where条件是动态可变,需要查阅2-4张表中数据,因此想做个临时表,根据动态的where条件,动态生成临时表,这样提高查询效率.不知程序中应该怎么写,求助各位大神,谢谢!

ios-越狱的iPhone程序中删除应用图标

问题描述 越狱的iPhone程序中删除应用图标 在越狱设备上,通过编程删除应用图标.不知道怎么做?谢谢 解决方案 修改应用绑定的Info.plist文件,填上这个 : <key>SBAppTags</key><array> <string>hidden</string></array> 点击这里

请教大神如何修改和替换 C# EXE 程序中的 ico 图标与文本资源?

问题描述 我想修改一款国外软件主程序中的资源文件,包括程序中不同像素的ico图标和里面的一些文本提示信息,由于没有源程序,所以想通过第三方工具进行修改,不知道哪位大神有这方面的经验,请告知一下.非常感谢!我的Email:860861001@qq.com,留下联系方式必有重谢! 解决方案 解决方案二:用exescope解决方案三:其实用vs也可以修改,直接打开exe,以资源方式打开,即可.解决方案四:用exescope测试过,可以读取到程序中的ico图标,但是无法替换,一直提示不能更改资源的大小.

在DELPHI程序中动态设置ODBC数据源

在DELPHI数据库应用程序中,我们访问数据库通常有两种方法.一种是通过BDE数据库搜索引擎,即利用DELPHI自带的数据库驱动程序,这种方法的优点是速度快,但应用范围有限,当数据库版本更新时,有可能不能用于操作新的数据库:另一种方法是通过ODBC,这种方法的优点是可以随操作系统(如WINDOWS)提供,作为标准接口能适应多种数据库,缺点是速度慢.在编程时,我们可以根据需要选择其中的一种方法. 在利用ODBC访问数据库时,通常的方法时是在ODBC管理面板中设置一个ODBC系统数据源 (系统DSN

在DELPHI程序中使用ADO对象存取ODBC数据

作为一个ASP爱好者,笔者经常在ASP页面中使用ADO对象操作ODBC数据库,觉得用ASP创建WEB应用系统确定挺方便的.虽然在编程生涯中,笔者更喜欢Borland系列产品,对微软产品有点排斥,对ASP却是例外.某天,灵机一动,ADO对象是一个标准OLE对象,如果在DELPHI应用程序中能利用ADO操作数据库,应该挺不错.尤其在用DELPHI做网络数据库应用程序时,如果所在的WEB站点是WINNT站点并且支持ASP页面,就可以用ADO对象访问ODBC数据库,而不用把那么大的BDE再上载到站点上去

如何在标题栏中显示动态图标

一般情况下,程序中的标题栏的图标是静态的.那么如何让标题栏中的图标动起来呢.原理很简单,那就是做一系列的图片,让图片按顺序交替显示,图标就像动起来一样.现在动手来做吧! 1.新建一个CAnimateIcon类 a.AnimateIcon.h如下: class CAnimateIcon { protected: //创建一个列表变量,用于保存图像列 CImageList m_imgList; //当前图像序号 int m_iImageCounter; //图像总数 int m_iMaxNumOfI

分享我用Qt开发的应用程序【二】在Qt应用程序中使用字体图标fontawesome

为了使用简单,需要先写一个单件类,头文件的代码如下: 其中静态方法Instance保证IconHelper的实例全局唯一 (注意构造函数已经私有化了) #ifndefICONHELPER_H #defineICONHELPER_H #include<QObject> #include<QMutex> #include<QMutexLocker> #include<QtGui> #include<QtWidgets> #include<qfo

怎么把windows程序图标用鼠标拖到窗体程序中

问题描述 怎么把windows程序图标用鼠标拖到窗体程序中 怎么把windows程序图标用鼠标拖到窗体程序中,怎么在程序中管理这些图标,图标的程序执行? 解决方案 你可以响应鼠标的拖放事件,比如说oledrogover