特别是,我希望能够在运行时获得小图标(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。
发布于 2010-06-28 06:47:41
我结束了P/Invoking。事实证明,LoadIcon和LoadImage都表现出与SystemIcons
相同的(有缺陷的,IMO)行为。但是SHGetStockIconInfo,在Vista和更高版本上可用,如预期的那样工作,返回我一直在寻找的小的,官方的,设计师制作的图标。
在XP和更早的版本上,我又回到了使用VS Image Library中提供的小图标。
如果您正在考虑自己使用P/调用SHGetStockIconInfo
,我建议您查看一下Windows API Code Pack,看看是如何实现的。
发布于 2010-06-16 12:50:58
您必须自己缩放它们。如您所知,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
方法来清理句柄。
https://stackoverflow.com/questions/3031124
复制相似问题