在應(yīng)用程序的編寫(xiě)中,組合框(ComboBox)、列表框(ListBox)、等常見(jiàn)的部件,通常不僅要用于顯示文字,而且還要顯示其與文字相關(guān)的圖標(biāo)。在一般的Windows應(yīng)用程序中,這些圖標(biāo)的顯示都要隨列出的顯示文本的變化而變化,例如在組合框中列出當(dāng)前目錄下的所有文件時(shí),在組合框左邊就顯示與文件名相關(guān)聯(lián)的圖標(biāo),這就是所謂的動(dòng)態(tài)圖標(biāo)。在Delphi中使用動(dòng)態(tài)圖標(biāo)的步驟如下:
一、圖標(biāo)的獲取
要使用動(dòng)態(tài)圖標(biāo),首先要解決的是如何獲得顯示文本和與其相關(guān)聯(lián)的圖標(biāo)句柄。該圖標(biāo)通過(guò)文件關(guān)聯(lián)由系統(tǒng)注冊(cè)表決定,并且在Windows編程中同一文件(或子目錄,或文件夾)在桌面上也可能有兩種顯示結(jié)果,這就是DOS文件名與顯示名(Display Name)。如果我們的應(yīng)用程序不需要有像Windows資源瀏覽器那樣的效果,則可以使用FindFirst()和FindNext()二個(gè)函數(shù)以及FindClose()過(guò)程來(lái)獲得DOS文件名,否則我們就應(yīng)當(dāng)使用WindowSAPI來(lái)獲得顯示名。在獲得文件名的同時(shí)可通過(guò)使用ShellAPI.pas中的SHGetFileInfo()函數(shù)來(lái)獲得其圖標(biāo)句柄HICON,說(shuō)明如下:
function SHGetFileInfo(pszPath: PAnsiChar; dwFileAttributes: DWORD;var psfi: TSHFileInfo; cbFileInfo,uFlags: UINT): DWORDl;
pszPath 參數(shù):指定的文件名。當(dāng)uFlags的取值中不包含 SHGFI_PIDL時(shí),可直接指定;否則pszPath要通過(guò)計(jì)算獲得,不能直接指定;
dwFileAttributes參數(shù):文件屬性,僅當(dāng)uFlags的取值中包含SHGFI_USEFILEATTRIBUTES時(shí)有效,一般不用此參數(shù);
psfi 參數(shù):返回獲得的文件信息,是一個(gè)記錄類(lèi)型,有以下字段:
hIcon: HICON; //文件的圖標(biāo)句柄
iIcon: Integer; //圖標(biāo)的系統(tǒng)索引號(hào)
dwAttributes: DWORD; //文件的屬性值
szDisplayName: array [0..MAX_PATH-1] of AnsiChar; //文件的顯示名
szTypeName: array [0..79] of AnsiChar; //文件的類(lèi)型名
cbFileInfo 參數(shù):psfi的比特值;
uFlags 參數(shù):指明需要返回的文件信息標(biāo)識(shí)符,常用的有以下常數(shù):
SHGFI_ICON; //獲得圖標(biāo)
SHGFI_DISPLAYNAME; //獲得顯示名
SHGFI_TYPENAME; //獲得類(lèi)型名
SHGFI_ATTRIBUTES;//獲得屬性
SHGFI_LARGEICON; //獲得大圖標(biāo)
SHGFI_SMALLICON; //獲得小圖標(biāo)
SHGFI_PIDL;// pszPath是一個(gè)標(biāo)識(shí)符
函數(shù)SHGetFileInfo()的返回值也隨uFlags的取值變化而有所不同。通過(guò)調(diào)用SHGetFileInfo()可以由psfi參數(shù)得到文件的圖標(biāo)句柄,但要注意在uFlags參數(shù)中不使用SHGFI_PIDL時(shí),SHGetFileInfo()不能獲得"我的電腦"等虛似文件夾的信息。
一、圖標(biāo)的獲取
要使用動(dòng)態(tài)圖標(biāo),首先要解決的是如何獲得顯示文本和與其相關(guān)聯(lián)的圖標(biāo)句柄。該圖標(biāo)通過(guò)文件關(guān)聯(lián)由系統(tǒng)注冊(cè)表決定,并且在Windows編程中同一文件(或子目錄,或文件夾)在桌面上也可能有兩種顯示結(jié)果,這就是DOS文件名與顯示名(Display Name)。如果我們的應(yīng)用程序不需要有像Windows資源瀏覽器那樣的效果,則可以使用FindFirst()和FindNext()二個(gè)函數(shù)以及FindClose()過(guò)程來(lái)獲得DOS文件名,否則我們就應(yīng)當(dāng)使用WindowSAPI來(lái)獲得顯示名。在獲得文件名的同時(shí)可通過(guò)使用ShellAPI.pas中的SHGetFileInfo()函數(shù)來(lái)獲得其圖標(biāo)句柄HICON,說(shuō)明如下:
function SHGetFileInfo(pszPath: PAnsiChar; dwFileAttributes: DWORD;var psfi: TSHFileInfo; cbFileInfo,uFlags: UINT): DWORDl;
pszPath 參數(shù):指定的文件名。當(dāng)uFlags的取值中不包含 SHGFI_PIDL時(shí),可直接指定;否則pszPath要通過(guò)計(jì)算獲得,不能直接指定;
dwFileAttributes參數(shù):文件屬性,僅當(dāng)uFlags的取值中包含SHGFI_USEFILEATTRIBUTES時(shí)有效,一般不用此參數(shù);
psfi 參數(shù):返回獲得的文件信息,是一個(gè)記錄類(lèi)型,有以下字段:
hIcon: HICON; //文件的圖標(biāo)句柄
iIcon: Integer; //圖標(biāo)的系統(tǒng)索引號(hào)
dwAttributes: DWORD; //文件的屬性值
szDisplayName: array [0..MAX_PATH-1] of AnsiChar; //文件的顯示名
szTypeName: array [0..79] of AnsiChar; //文件的類(lèi)型名
cbFileInfo 參數(shù):psfi的比特值;
uFlags 參數(shù):指明需要返回的文件信息標(biāo)識(shí)符,常用的有以下常數(shù):
SHGFI_ICON; //獲得圖標(biāo)
SHGFI_DISPLAYNAME; //獲得顯示名
SHGFI_TYPENAME; //獲得類(lèi)型名
SHGFI_ATTRIBUTES;//獲得屬性
SHGFI_LARGEICON; //獲得大圖標(biāo)
SHGFI_SMALLICON; //獲得小圖標(biāo)
SHGFI_PIDL;// pszPath是一個(gè)標(biāo)識(shí)符
函數(shù)SHGetFileInfo()的返回值也隨uFlags的取值變化而有所不同。通過(guò)調(diào)用SHGetFileInfo()可以由psfi參數(shù)得到文件的圖標(biāo)句柄,但要注意在uFlags參數(shù)中不使用SHGFI_PIDL時(shí),SHGetFileInfo()不能獲得"我的電腦"等虛似文件夾的信息。

