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

标签 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。

最佳答案

您必须自己扩展它们。正如您所发现的,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 方法在您完成后清理句柄。

关于c# - 有没有办法在 .NET 中获取不同大小的 Windows 系统图标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3031124/

相关文章:

c# - 添加新 View 时 ASP.NET MVC4 "resource not found"

c# - 如何将类型的默认值设置为 Nothing?

.net - 'GenerateBindingRedirectsOutputType' 选项有什么作用?

c# - 我可以在 DLL 中嵌入其他文件吗?

c# - WinForms - 启用设计模式

c# - 无尖点的线偏移(平行线)

c# - ASP.NET 面板在加载到浏览器中之前忽略样式

.NET 类型转换问题 : Simple but difficult

.net - Visual Studio 2012 winform 设计器非常慢

c# - 如何在 C# 中返回 Min 谓词中的对象?