有没有办法在.NET中获得不同大小的Windows系统图标?

时间:2010-06-13 04:52:58

标签: c# .net winforms icons

特别是我希望能够在运行时获得小(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,如果这就是它。

3 个答案:

答案 0 :(得分:13)

你必须自己扩展它们。正如您所发现的,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示例here,尤其是在完成后使用DestroyIcon方法清理句柄。

答案 1 :(得分:6)

我结束了P / Invoking。事实证明,LoadIconLoadImage都表现出与SystemIcons相同(有缺陷的IMO)行为。但SHGetStockIconInfo,可在Vista及更高版本上使用,按预期工作,返回我一直在寻找的小型,官方,设计师制作的图标。

在XP及更早版本中,我正在回归使用VS Image Library中提供的小图标。

如果您正在考虑自己P / Invoking SHGetStockIconInfo,我建议您查看Windows API Code Pack以了解具体方法。

答案 2 :(得分:1)

此构造函数重载的文档说:

  

“初始化Icon类的新实例,并尝试查找与所请求大小匹配的图标版本。

     

“如果找不到与大小完全匹配的版本,则使用最接近的匹配。   如果original参数是Icon,只有一个尺寸,此方法只会创建一个重复的图标。“

我认为这个图标只有一个尺寸(32×32);并且获得不同尺寸的唯一方法是将此图标缩放到您的尺寸,如您的示例所示。