如何使用Delphi从另一个文件的资源加载单个图标?

时间:2011-10-09 14:01:03

标签: delphi winapi resources icons

我想加载一个图标(来自另一个文件),其中没有嵌入多个图标(它不是图标组)。 我不知道它的大小。 我现在使用此代码来检索图标的句柄并将其与TIcon.Handle一起使用:

function ResourceToIconHandle(hFile: hModule; IDname: PChar): HICON;
var
   hGicon1,
   hLoadIcon1: THandle;
   pGIcon1: Pointer;
begin
   hGicon1 := FindResource(hFile, IDName, RT_ICON);
   if hGicon1 <> 0 then
   begin
      hLoadIcon1 := LoadResource(hFile, hGicon1);
      pGicon1 := LockResource(hLoadIcon1);
      Result := CreateIconfromResource(pGicon1,
           SizeofResource(hFile, hGicon1),
           True,
           $00030000);
   end;
end;

是的,它只是代码的一部分(如果你想要我全部显示)。 它仅适用于一个问题:CreateIconfromResource函数给我任何以32x32拉伸的图标:

1 http://22.imagebam.com/download/u7q9PTEAUlSeZ1IJXQ5ViA/15321/153201662/bad.PNG

但我希望以原始分辨率获取图标: 2 http://56.imagebam.com/download/yH_Nc9dfsADso0W9A2bL1w/15321/153204932/good.PNG

我知道CreateIconfromResource旨在以相同的分辨率获取它们,这就是我正在寻找另一个功能的原因。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:11)

使用CreateIconFromResourceEx代替CreateIconFromResource

CreateIconFromResourceEx可让您提供所需的宽度/高度,而CreateIconFromResource则使用默认的系统mertics(例如LR_DEFAULTSIZE解释):

  

使用系统指标值指定的宽度或高度   如果cxDesired或cyDesired值设置为,则为游标或图标   零。如果未指定此标志且cxDesired和cyDesired是   设置为零,该函数使用实际的资源大小。如果   资源包含多个图像,该函数使用的大小   第一张图片。

答案 1 :(得分:0)

Roman R.可能是对的,但我还补充说,在设置其句柄之前,必须设置TIcon对象的正确尺寸。