【问题标题】:Is there a way to get different sizes of the Windows system icons in .NET?有没有办法在 .NET 中获得不同大小的 Windows 系统图标?
【发布时间】:2010-06-13 04:52:57
【问题描述】:

我特别希望能够在运行时获得小 (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。

【问题讨论】:

    标签: c# .net winforms icons


    【解决方案1】:

    您必须自己缩放它们。如您所见,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 方法在您完成后清理句柄。

    【讨论】:

    • 你是对的。 DrawIcon 似乎没有考虑插值模式。用 DrawBitmap 替换 DrawIcon,使用 SystemIcons.Error.ToBitmap() 将你的图标转换成 bmp,你会得到一个不错的结果。
    • 现在您已经以更小的尺寸重新绘制了图标图像,您如何从上面的代码中获取Icon 对象?
    • MSDN 有一个很好的例子here。基本上,在新制作的位图上调用GetHicon,然后您可以使用静态Icon.FromHandle 方法。注意他们使用外部DestroyIcon 方法。在 C# 中直接使用句柄感觉很麻烦,需要适当的清理,但是很好。
    【解决方案2】:

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

    在 XP 和更早版本上,我将回退到使用 VS 图像库中提供的小图标。

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

    【讨论】:

    • 您认为您可以为此解决方案提供代码示例,包括非 Vista 回退吗?
    【解决方案3】:

    这个构造函数重载的文档说:

    “初始化Icon 类的新实例并尝试查找与请求大小匹配的图标版本。

    "如果找不到与大小完全匹配的版本,则使用最接近的匹配。 如果original 参数是具有单一尺寸的Icon,则此方法只会创建重复图标。"

    我认为这个图标只有一种尺寸(32×32);获得不同尺寸的唯一方法是将此图标缩放到您的尺寸,如您的示例所示。

    【讨论】:

    • 这些图标肯定以较小的尺寸存在。如果我无法通过 SystemIcons 访问它们,那很好,但我想知道是否有可行的方法。
    • 抱歉,请问您是怎么​​知道这些图标以较小的尺寸存在的?
    • @PavelBelousov 如果你检查 C:\Windows\System32\user32.dll 使用一些能够提取图标资源的图标编辑器,你会看到这些的所有大小和颜色深度标准图标。可用尺寸为 16x16、32x32、48x48。
    猜你喜欢
    • 2019-08-20
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 2021-12-17
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多