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

7
我希望加载一个图标(来自另一个文件),它不包含多个嵌入其中的图标(不是一个图标组)。 我不知道它的大小。 现在我使用这段代码检索图标的句柄,并将其与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

但我希望能够以原始分辨率获取图标: 2 我知道CreateIconfromResource旨在以相同的分辨率获取它们,这就是为什么我正在寻找另一个函数。 谢谢你的帮助。

1
你尝试过调用CreateIconFromResourceEx并传递适当的大小吗?我也不明白为什么你不使用图标组,但这不是问题的重点。 - David Heffernan
@David Heffernan 我知道CreateIconFromResourceEx,但我不知道如何找到它们的分辨率,因为我是从另一个exe文件中加载它们的。在那个exe文件中可能有一个图标组或仅仅是一个图标。我使用CreateIconFromResourceEx解决了图标组的问题,但我需要以它们原始分辨率加载单个图标。 - DavidB
@David Heffernan,是的,您使用CreateIconFromResourceEx的想法很好,我只需要正确设置参数即可。谢谢。 - DavidB
顺便提一句,您现在已经有足够的声望来投票并接受答案了。 - David Heffernan
1
是的,我注意到了并且已经投票了。谢谢你告诉我。 - DavidB
2个回答

11

使用CreateIconFromResourceEx替代CreateIconFromResource

CreateIconFromResourceEx允许您提供所需的宽度和高度,而CreateIconFromResource则使用这些值的默认系统度量标准(例如对于 LR_DEFAULTSIZE的解释):

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


谢谢。我尝试使用LR_DEFAULTSIZE和零值来设置cxDesired和cyDesired,但仍然得到所有图标的32x32大小。我无法将cxDesired和cyDesired的值传递给函数,因为我不知道图标的宽度和高度(它们是从另一个文件中加载的)。 - DavidB
API要求您要么(a)请求特定大小,(b)让API加载默认系统大小,(c)指示使用组中第一个图标的大小读取图标。如果您对此不满意(可能是),则必须首先枚举可用的图标大小。为此,您需要锁定资源数据并直接访问它。请参阅有关图标资源数据格式的以下链接:http://msdn.microsoft.com/en-us/library/ms997538.aspx,http://msdn.microsoft.com/en-us/library/windows/desktop/ms648007%28v=vs.85%29.aspx - Roman R.
请查看以下链接以枚举可用的图标尺寸:http://www.codeproject.com/KB/DLL/ICON_Resources.aspx?display=Print - Roman R.
我明白了,谢谢。但似乎问题出在其他地方,将最后3个参数设置为0确实有效。非常感谢您的帮助。我会将您的答案标记为好的。 - DavidB
很可能它能够工作是因为最大的图标排在第一位,参见上面的注释(c)。 - Roman R.

0
Roman R. 可能是对的,但我也要补充一点,在设置 TIcon 对象的 Handle 之前,您必须先设置其适当的尺寸。

谢谢。实际代码适用于RT_GROUP_ICON,但在设置其句柄之前未设置TIcon对象的正确尺寸。无论如何,我不知道如何设置正确的尺寸(您是在谈论宽度和高度吗?)因为我不知道图标的宽度和高度。 - DavidB
在从流中加载之前需要设置宽度和高度。从 Handle 加载可能不需要它们。对不起,我忘了这一点。距离我上次查看 TIcon 源码已经将近两年了 :( - Torbins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接