繁体   English   中英

Windows窗体.NET 2.0:如何绘制PNG图标?

[英]Windows Forms .NET 2.0: How to draw a PNG icon?

注意:问题在应用程序中使用256 x 256 Vista图标处理使用“Vista”图标作为应用程序的图标。 这个问题涉及手动绘制Vista图标。

注意:问题WinForms .NET 2.0:如何绘制正确大小的图标? 处理绘制从文件加载的Vista图标。 这个问题涉及绘制从.resource加载的Vista图标。


我在我的Visual Studio项目中包含了一个具有各种格式的图标:

  • 16×16
  • 32×32
  • 48×48
  • 256x256(PNG压缩)

现在想绘制256x256版本。 我尝试过的以下任何事情都没有。

下面将32x32格式绘制为256x256:

Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat;
e.Graphics.DrawIcon(ico, new Rectangle(0, 0, 256, 256));

以下是未拉伸的32x32格式:

Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat;
e.Graphics.DrawIconUnstretched(ico, new Rectangle(0, 0, 256, 256));

下面将32x32格式绘制为256x256:

Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat;
e.Graphics.DrawImage(ico.ToBitmap(), new Rectangle(0, 0, 256, 256));

下面将48x48格式绘制为256x256:

Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat;
e.Graphics.DrawIcon(
      new Icon(ico, new Size(256, 256)),
      new Rectangle(0, 0, 256, 256));

如何绘制256x256格式图标?


笔记:

  1. 该图标不是来自文件,因此PInvoking LoadImage()将无济于事。

  2. 该图标不是与文件关联的图标,因此PInvoking SHGetFileInfo() 无济于事。 也不会使用Icon.ExtractAssociatedIcon

  3. 我也没有尝试在运行时创建256x256格式的图标,因此设计用于实现这一目标的库无济于事。

    2 :问题WinForms .NET 2.0:如何绘制正确大小的图标?

ResourceManager根据存储在资源中的位加载图标。 但是,它处理加载的方式不允许您访问256x256图标(此信息不会进入您正在返回的System.Drawing.Icon )。

我很抱歉让你失望,但我所知道的唯一方法是通过LoadImage的P / Invoke加载图标并使用文件(是的,我知道,这不是你想要的)。 所以新问题应该是:如何提取给定资源的位以便我可以将它们存储到文件中? 我担心这也是不可能的,因为资源数据似乎是序列化.NET对象的集合,所以通过System.Resources.ResourceReader完成了一些步骤。

无论如何,对于那些有能力从.ICO文件加载图标的人(以及我自己,作为如何加载256x256图标的未来参考),请调用IconConverter.LoadIcon

using System.Runtime.InteropServices;

static class IconConverter
{
    public static System.Drawing.Icon LoadIcon(string path, int width, int height)
    {
        System.IntPtr hIcon;
        hIcon = LoadImage (System.IntPtr.Zero, path, IMAGE_ICON, width, height,
                           LR_LOADFROMFILE);
        if (hIcon == System.IntPtr.Zero)
        {
            return null;
        }
        return System.Drawing.Icon.FromHandle (hIcon);
    }

    const int IMAGE_ICON = 1;
    const int LR_LOADFROMFILE = 0x0010;

    [DllImport ("user32.dll", SetLastError=true, CharSet=CharSet.Auto)]
    static extern System.IntPtr LoadImage(System.IntPtr hInstance,
                                          string lpszName, uint uType,
                                          int cxDesired, int cyDesired,
                                          uint fuLoad);
}

一旦你有预期大小的System.Drawing.Icon ,只需使用graphics.DrawIconUnstretched绘制它。

今天,我做了一个非常好的功能, 从Vista图标中提取256x256位图

我用它在“关于”框中将大图标显示为位图。

此函数将Icon对象作为参数。 因此,您可以将它与任何图标一起使用 - 来自资源 ,文件,流等。 它可以运行在任何操作系统 ,因为它使用任何的Win32 API,它是100%托管代码:-)

Bitmap ExtractVistaIcon(Icon icoIcon)

我在这里发布了我的函数: ExtractVistaIcon()

我刚才问了一个类似的问题,但运气不好。 我的帖子中的一些答案可能对你有帮助,有一种方法,但看起来很难。 链接到我的职位在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM