使用LoadImage兼容加载小型OEM图标

时间:2011-07-07 15:58:51

标签: delphi winapi

我相信我的代码符合LoadImage规范,但是尽管明确指定了维度,但加载的图片是最大的非PNG图标。

procedure TForm1.FormCreate(Sender: TObject);
begin
  Image1.Picture.Icon.Handle := LoadImage(
    0,
    MakeIntResource(OIC_SHIELD),
    IMAGE_ICON,
    GetSystemMetrics(SM_CXSMICON),
    GetSystemMetrics(SM_CYSMICON),
    LR_SHARED
  );
  Win32Check(Image1.Picture.Icon.HandleAllocated);

  OutputDebugString(PChar(Format('%d×%d', [
    Image1.Picture.Icon.Width, 
    Image1.Picture.Icon.Height
  ]))); //  128×128
end;

注意:我更愿意遵守更新的LoadImage语义,而不是依赖于{{3的答案中指定的显式模块和资源ID(基本上回退到LoadIcon语义)。 }}


来自LoadImage规范的引言正好勾勒出我的互斥LoadImage行为问题(无论是失败还是使用以前加载的库存资源,忽略了所需的尺寸) - 请参阅this question


虽然OIC_SHIELD特定于Windows 6.0+,但自版本4.0以来Windows中存在的其他股票图标(OIC_xxx常量)也是如此。

2 个答案:

答案 0 :(得分:5)

在Vista及更高版本上使用SHGetStockIconInfo,在所有其他操作系统上使用其他问题的解决方案。

答案 1 :(得分:4)

来自您链接到的LoadImage文档中LR_SHARED上的注释:

  

此函数使用请求的资源名称查找缓存中的第一个图像,无论请求的大小如何。

不幸的是,你不能放弃LR_SHARED,因为:

  

加载系统图标或光标时,必须使用LR_SHARED,否则该功能将无法加载资源。

因此,这解释了问题,但不清楚该怎么做。您可以使用SHGetStockIconInfo。这需要Vista +,但是因为你试图获得盾牌图标,我认为你已经限制在Vista +中了。

我不是.NET程序员,但看起来有一个API to get the shield icon