如何加载小型系统图标?

9
我需要显示16x16像素的错误/警告/信息图标。不幸的是,LoadIcon(0, IDI_*)LoadImage(0, OIC_*, IMAGE_ICON, 16, 16, LR_SHARED)都会给我32x32版本的图标。
我了解到ShGetStockIconInfo,但它只适用于Vista及以上版本,而我仍然需要支持XP。
有什么想法吗?
我正在使用Delphi 2010和TImage组件,如果这有影响。

你试图加载的图标是否可用作16x16?如果该图标仅为32x32,则始终会得到32x32。 - Wim ten Brink
这些图标可用于16/32/48像素。 - David Heffernan
1个回答

17
问题在于,当您按照这种方式处理时,您会得到缓存版本的图标,即系统加载的第一个图标。那将是大尺寸图标,通常为32x32像素。无论您指定什么大小都没有关系。
您可以做的是查找user32.dll中所需资源的ID,并使用类似以下内容的东西:
LoadImage(GetModuleHandle('user32'), MAKEINTRESOURCE(103), IMAGE_ICON,
    16, 16, LR_DEFAULTCOLOR);

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

我不确定您从哪里获取user32资源的资源ID,甚至不确定它们是否保证在不同的Windows版本中保持不变。我的猜测是它们会保持不变,因为太多程序会崩溃,但这只是纯粹的猜测。


感谢您对为什么它不能按照我的方式工作进行了出色的解释! - Oliver Giesen
6
100: IDI_APPLICATION, 101: IDI_WARNING, 102: IDI_QUESTION, 103: IDI_ERROR, 104: IDI_INFORMATION, 105:IDI_WINLOGO, 106: IDI_SHIELD,这些内容是使用ResourceHacker进行反向工程处理得到的。 - David Heffernan
所以,我现在可以确认这种方法适用于我关心的所有平台(即XP及以上版本,包括Server 2003和2008)。再次感谢! - Oliver Giesen
否定。哪种缓存以及如何摆脱它?此外,我不喜欢为系统范围的资源跟踪模块名称和资源ID的想法。 - Premature Optimization
1
@David Heffernan 谢谢!我刚刚浪费了一整天的时间,试图弄清楚为什么(Delphi的)imagelist在我将从user32.dll加载的16x16图标插入其中时显示一个32x32图标。问题是由于Windows图标的普遍即时调整大小,让我确信我真的得到了16x16图标(我甚至将其保存到文件中,并且它确实是16x16 - 在图像查看器中检查过)。所以你刚刚解决了我的疑惑,谢谢。 - kostix

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