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

And*_*att 17 .net c# icons winforms

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

我试过这个:

new Icon(SystemIcons.Error, SystemInformation.SmallIconSize)
Run Code Online (Sandbox Code Playgroud)

据称"试图找到符合要求尺寸的图标版本",但它仍然给我一个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));
}
Run Code Online (Sandbox Code Playgroud)

但这只是将32 x 32图标缩小为丑陋的16 x 16.

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

Sea*_*ley 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());
Run Code Online (Sandbox Code Playgroud)

请务必查看此处的MSDN示例,尤其是在完成后使用该DestroyIcon方法清理句柄.


And*_*att 6

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

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

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