【问题标题】:How to load a small system icon?如何加载一个小的系统图标?
【发布时间】:2010-11-26 14:01:32
【问题描述】:

我需要为错误/警告/信息显示 16x16 像素图标。不幸的是,LoadIcon(0, IDI_*)LoadImage(0, OIC_*, IMAGE_ICON, 16, 16, LR_SHARED) 总是给我 32x32 版本的图标。

我读到了关于ShGetStockIconInfo 的信息,但它只适用于从 Vista 开始的版本,我仍然需要支持 XP。

有什么想法吗?

如果这很重要,我正在使用带有 TImage 组件的 Delphi 2010。

【问题讨论】:

  • 您尝试加载的图标是否为 16x16?如果图标只有 32x32,则始终是 32x32。
  • 这些图标在 16/32/48px 中可用

标签: delphi timage loadimage


【解决方案1】:

问题是,当你这样做时,你会得到一个缓存版本的图标,系统加载的第一个。那将是大尺寸的图标,通常为 32x32。您指定的尺寸无关紧要。

您可以做的是在 user32.dll 中找到所需资源的 ID 并使用如下内容:

LoadImage(GetModuleHandle('user32'), MAKEINTRESOURCE(103), IMAGE_ICON,
    16, 16, LR_DEFAULTCOLOR);

您最好致电GetSystemMetrics(SM_CXSMICON) 来获取图标大小而不是硬编码 16,但您可能已经知道这一点。

我不确定您从哪里获得 user32 中资源的资源 ID,或者即使它们能保证它们在不同的 Windows 版本中保持不变。我的猜测是他们会这样做,因为太多的程序会崩溃,但这只是纯粹的猜测。

【讨论】:

  • 感谢您出色地解释了为什么它不能按照我的方式工作!
  • 100: IDI_APPLICATION, 101: IDI_WARNING, 102: IDI_QUESTION, 103: IDI_ERROR, 104: IDI_INFORMATION, 105:IDI_WINLOGO, 106: IDI_SHIELD,使用ResourceHacker进行逆向工程
  • 所以,我现在可以确认这种方法适用于对我来说很重要的所有平台(即 XP 及更高版本,包括 Server 2003 和 2008)。再次感谢!
  • 否定。哪个缓存以及如何摆脱它?另外,我不喜欢跟踪系统范围资源的模块名称和资源ID。
  • @David Heffernan 谢谢!我刚刚杀死了一整天试图弄清楚为什么(Delphi的)图像列表在我插入从user32.dll加载的16x16图标时显示32x32图标。问题是 Windows 图标的普遍即时调整大小让我确信我真的得到了 16x16 图标(我什至将它保存到一个文件中,它确实是 there 16x16 ——签入图像查看器)。所以你刚刚解决了我的谜团,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
  • 2010-10-08
  • 2023-03-03
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
相关资源
最近更新 更多