2012-02-10 84 views
7

我使用此代碼獲取shell圖標(在Windows資源管理器中顯示的圖標)。
有沒有人有更快的方式獲得這些圖標的經驗? SHGetFileInfo似乎很慢。獲取shell圖標的最快方法

procedure TForm2.Button1Click(Sender: TObject); 
var 
    FileInfo: TSHFileInfo; 
begin 
    FillChar(FileInfo, SizeOf(FileInfo), 0); 
    if SHGetFileInfo(PChar('c:\windows\'), 0, FileInfo, SizeOf(FileInfo), 
    SHGFI_ICON or SHGFI_SMALLICON or SHGFI_SYSICONINDEX) <> 0 then 
    DrawIconEx(Canvas.Handle, 10, 10, FileInfo.hIcon, 0, 16, 16, 0, DI_IMAGE or 
     DI_MASK); 
end; 

謝謝!

+3

我以前用C++應用程序沒有問題的方法。雖然略有不同,但我只使用了標記'SHGFI_ICON'和'SHGFI_USEFILEATTRIBUTES'。 – alf 2012-02-10 15:20:23

+1

是的,如果速度有問題,一定要使用'SHGFI_USEFILEATTRIBUTES'。因此,'SHGetFileInfo()'跳過查詢實際文件的屬性,這可能需要一些時間。 – 2012-02-10 21:06:17

回答

3

我在使用SHGetFileInfo時使用了緩存。除非它是一個.exe或.ico文件(可能還有其他幾個文件),否則該圖標對於相同的文件擴展名將是相同的,因此當您顯示一個dir列表時,您可以對同一類型的文件使用相同的圖標,而您不必再次調用(並等待)SHGetFileInfo。

+2

你怎麼知道要緩存?任何類型都可以有動態圖標,%1爲.ico和.bmp等,任何類型的外殼擴展... – Anders 2012-02-10 16:00:31

+0

@TLama,緩存的想法是避免爲每個文件調用SHGetFileInfo,因爲它很慢,所以它只是在遇到新的文件類型時需要調用它。 – 2012-02-10 21:29:10

+1

@安德斯,是的,你是對的,它不是完全安全的,因爲不同的類型可能沒有固定的圖標。 – 2012-02-10 21:29:46

相關問題