是否有一种方法可以在.NET中获取不同大小的Windows系统图标?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

特别是我希望能够在运行时获得小型(16 x 16)图标。

我试过这个:

new Icon(SystemIcons.Error, SystemInformation.SmallIconSize)

据称“试图找到符合请求大小的图标版本”,但它仍然给我一个32 x 32图标。我也试过:

Size iconSize = SystemInformation.SmallIconSize;
Bitmap bitmap = new Bitmap(iconSize.Width, iconSize.Height);
using (Graphics g = Graphics.FromImage(bitmap))
{
    g.DrawIcon(SystemIcons.Error, new Rectangle(Point.Empty, iconSize));
}

但是,这只是将32 x 32图标缩放到一个丑陋的16 x 16。

我曾考虑过将图标从VS图像库中拖出来,但我真的希望它们能够随着操作系统(XP上的XP图标,Vista上的Vista图标等)动态变化。如果这是需要的,我愿意进行P / Invoke。

提问于
用户回答回答于

我结束了P / Invoking。事实证明,这两种LoadIcon的LoadImage表现出相同的(有缺陷,IMO)的行为SystemIcons。但是,在Vista和更高版本上提供的SHGetStockIconInfo,能够按预期工作,并返回我一直在寻找的小巧,官方,设计师制作的图标。

在XP和更早的版本中,我正在使用VS图像库中提供的小图标。

如果你正在考虑P / Invoking SHGetStockIconInfo自己,我建议看一下Windows API代码包,看看如何。

用户回答回答于

你必须自己扩展它们。正如你发现的,SystemIcons只有32x32。可以根据需要轻松将它们缩放到16或48。使用插值得到一个很好的双三次调整大小。我们已经成功完成了很多次,创造了非常漂亮的16x16版本,无论运行XP还是Vista还是7,它都能正常工作。

Size iconSize = SystemInformation.SmallIconSize;
Bitmap bitmap = new Bitmap(iconSize.Width, iconSize.Height);

using (Graphics g = Graphics.FromImage(bitmap))   
{
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
    g.DrawImage(SystemIcons.Error.ToBitmap(), new Rectangle(Point.Empty, iconSize));   
}

Icon smallerErrorIcon = Icon.FromHandle(bitmap.GetHicon());

一定要查看这里的MSDN示例,尤其是在完成后使用该DestroyIcon方法清理句柄。

扫码关注云+社区