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方法清理句柄.
我结束了P/Invoking.事实证明,这两种LoadIcon和的LoadImage表现出相同的(有缺陷,IMO)的行为SystemIcons.但是,在Vista及更高版本上可用的SHGetStockIconInfo按预期工作,返回我一直在寻找的小型,官方,设计师制作的图标.
在XP及更早版本中,我将回归使用VS Image Library中提供的小图标.
如果您正在考虑P/Invoking SHGetStockIconInfo自己,我建议您查看Windows API代码包以了解具体方法.