特别是我希望能够在运行时获得小(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,如果这就是它。
答案 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。事实证明,LoadIcon和LoadImage都表现出与SystemIcons
相同(有缺陷的IMO)行为。但SHGetStockIconInfo,可在Vista及更高版本上使用,按预期工作,返回我一直在寻找的小型,官方,设计师制作的图标。
在XP及更早版本中,我正在回归使用VS Image Library中提供的小图标。
如果您正在考虑自己P / Invoking SHGetStockIconInfo
,我建议您查看Windows API Code Pack以了解具体方法。
答案 2 :(得分:1)
此构造函数重载的文档说:
“初始化
Icon
类的新实例,并尝试查找与所请求大小匹配的图标版本。“如果找不到与大小完全匹配的版本,则使用最接近的匹配。 如果
original
参数是Icon
,只有一个尺寸,此方法只会创建一个重复的图标。“
我认为这个图标只有一个尺寸(32×32);并且获得不同尺寸的唯一方法是将此图标缩放到您的尺寸,如您的示例所示。