delphi 動態獲取文件類型的圖標

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了 索引

相關文章
相關標籤/搜索