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

C# 有没有办法在.NET中获得不同大小的Windows系统图标?,c#,.net,winforms,icons,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.He

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

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

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

“如果找不到与大小完全匹配的版本,则使用最接近的匹配。 如果
原始
参数是一个具有单个大小的
图标
,则此方法仅创建一个重复图标


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

您必须自己缩放它们。您发现,系统图标只有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
方法清理句柄。

我结束了p/Invoking。结果表明,两者都是相同的(有缺陷,IMO)行为为
SystemIcons
。但是,它在Vista和更高版本上可用,按预期工作,返回我一直在寻找的小型、官方、设计师制作的图标

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


如果您正在考虑自己调用p/Invoking
SHGetStockIconInfo
,我建议您看看这些图标是如何存在的。

ller size?这些是标准图标和标准大小。您可以在Windows UX指南中看到它们的示例:。@PavelBelousov如果您使用能够提取图标资源的图标编辑器检查C:\Windows\System32\user32.dll,您将看到这些标准图标的所有大小和颜色深度。可用大小为16x16、32x32、48x48.Yo没错。DrawIcon似乎没有考虑插值模式。用DrawBitmap替换DrawIcon,使用SystemIcons.Error.ToBitmap()要在bmp中转换图标,您会得到一个很好的结果。现在您已经以较小的尺寸重新绘制了图标图像,如何从上面的代码中获得
图标
对象?MSDN有一个很好的例子。基本上,在新制作的位图上调用
GetHicon
,然后您可以使用静态
图标。FromHandle
方法。请注意n他们使用外部
destroycon
方法。在C#中直接使用句柄会让人感觉不舒服,需要进行适当的清理,但是很好。你认为你可以提供此解决方案的代码示例,包括非Vista回退吗?