2014-01-15 43 views
0

我遇到了SHGetFileInfo問題。我使用FPC 2.6.2與拉撒路1.0.14,這裏是代碼:SHGetFileInfo產生帶有黑色背景的圖標

procedure x; 
var 
    FI: SHFILEINFO; 
    icon: ticon; 
begin 
    SHGetFileInfo('app.exe', 0, FI, SizeOf(FI), SHGFI_SYSICONINDEX or SHGFI_ICON or SHGFI_LARGEICON); 

    icon := TIcon.Create; 
    icon.Handle := FI.hIcon; 
    icon.SaveToFile('extracted.ico'); 
end; 

的問題是它會產生黑色背景圖標文件,而不是OD透明。下面是它的樣子:

http://i.imgur.com/5BF3xbT.jpg

當我編譯在Delphi相同的代碼,它完美的作品。圖標具有透明背景。

我將不勝感激,如果有人可以幫助我解決這個問題:-)

回答

0

我有同樣的問題很久以前。 LCL似乎不能完全支持TIcon,因此您必須使用另一個類似的組件。我試過TKIcon,它工作。你可以在這裏找到http://www.tkweb.eu/en/delphicomp/kicon.html

我發佈了一個示例過程來提取圖標。這很簡單。

procedure ExtractIconAndSave(xpath: string); 
var 
    FileInfo: SHFILEINFO; 
    Icon: KIcon.TIcon; //Don't confused with Graphics.TIcon 
begin 
    //Get icon handle 
    SHGetFileInfo(PChar(xpath), 0, FileInfo, SizeOf(FileInfo), SHGFI_SYSICONINDEX or SHGFI_ICON or SHGFI_LARGEICON); 
    //Check if SHGetFileInfo get the icon handle 
    if FileInfo.hIcon <> 0 then 
    begin 
    //Use kIcon's TIcon - It supports alpha 32bpp 
    Icon := KIcon.TIcon.Create; 
    try 
     //Load icon handle in TKIcon and save it in a file 
     Icon.LoadFromHandle(FileInfo.hIcon); 
     Icon.SaveToFile('extracted.ico'); 
    finally 
     DestroyIcon(FileInfo.hIcon); 
     FreeAndNil(Icon); 
    end; 
    end; 
end; 
+0

謝謝,這很好用 – user1269348

+0

拉撒路1.2的RC2可用。可能值得重新測試。 –

+0

Lazarus 1.2 RC2不能解決此問題。實際上,當我在Lazarus 1.2 RC2(32位版本,TKicon不支持64位)中編寫並試用我的代碼示例時。 P.S .:也許在1.4?看到這個錯誤報告http://bugs.freepascal.org/view.php?id=19748 –