2014-01-15 44 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 –