Icons SHGetFileInfo生成黑色背景的图标
我对SHGetFileInfo有问题。我在Lazarus 1.0.14中使用FPC 2.6.2,代码如下:Icons SHGetFileInfo生成黑色背景的图标,icons,transparency,freepascal,lazarus,Icons,Transparency,Freepascal,Lazarus,我对SHGetFileInfo有问题。我在Lazarus 1.0.14中使用FPC 2.6.2,代码如下: 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 :
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;
问题是它会生成黑色背景的图标文件,而不是透明的。下面是它的样子:
当我在Delphi中编译相同的代码时,它工作得非常好。图标有透明的背景
如果有人能帮我解决这个问题,我将不胜感激:-)我以前也有同样的问题。LCL似乎不能完全支持TIcon的alpha,所以您必须使用另一个类似的组件。我试过TKIcon,效果很好。你可以在这里找到 我发布了一个提取图标的示例程序。这很简单
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;
过程ExtractIconAndSave(xpath:string);
变量
FileInfo:SHFILEINFO;
图标:KIcon.TIcon//不要与Graphics.TIcon混淆
开始
//获取图标句柄
SHGetFileInfo(PChar(xpath)、0、FileInfo、SizeOf(FileInfo)、SHGFI_SYSICONINDEX或SHGFI_图标或SHGFI_LARGEICON);
//检查SHGetFileInfo是否获得图标句柄
如果FileInfo.hIcon为0,则
开始
//使用kIcon的TIcon-它支持alpha 32bpp
图标:=KIcon.TIcon.Create;
尝试
//在TKIcon中加载图标句柄并将其保存在文件中
Icon.LoadFromHandle(FileInfo.hIcon);
Icon.SaveToFile('extracted.ico');
最后
销毁图标(FileInfo.hIcon);
FreeAndNil(图标);
终止
终止
终止
我以前也有同样的问题。LCL似乎不能完全支持TIcon的alpha,所以您必须使用另一个类似的组件。我试过TKIcon,效果很好。你可以在这里找到
我发布了一个提取图标的示例程序。这很简单
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;
过程ExtractIconAndSave(xpath:string);
变量
FileInfo:SHFILEINFO;
图标:KIcon.TIcon//不要与Graphics.TIcon混淆
开始
//获取图标句柄
SHGetFileInfo(PChar(xpath)、0、FileInfo、SizeOf(FileInfo)、SHGFI_SYSICONINDEX或SHGFI_图标或SHGFI_LARGEICON);
//检查SHGetFileInfo是否获得图标句柄
如果FileInfo.hIcon为0,则
开始
//使用kIcon的TIcon-它支持alpha 32bpp
图标:=KIcon.TIcon.Create;
尝试
//在TKIcon中加载图标句柄并将其保存在文件中
Icon.LoadFromHandle(FileInfo.hIcon);
Icon.SaveToFile('extracted.ico');
最后
销毁图标(FileInfo.hIcon);
FreeAndNil(图标);
终止
终止
终止
Lazarus 1.2的RC2可用。可能值得重新测试。Lazarus 1.2 RC2无法解决此问题。事实上,当我在Lazarus 1.2 RC2(32位版本,TKicon不支持64位)中编写并尝试代码示例时。附言:可能在1.4中?请参阅Lazarus 1.2的错误报告RC2。可能值得重新测试。Lazarus 1.2 RC2无法解决此问题。事实上,当我在Lazarus 1.2 RC2(32位版本,TKicon不支持64位)中编写并尝试代码示例时。附言:可能在1.4中?请参阅此错误报告