c# – 在应用程序中使用256 x 256 Vista图标

前端之家收集整理的这篇文章主要介绍了c# – 在应用程序中使用256 x 256 Vista图标前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个应用程序,我已经做了一个256 x 256的远程图标.

我想知道如何使用icx文件中的256×256 png作为应用程序图标,并将其显示在窗体上的图片框中.

我正在使用VB.net,但C#中的答案是正确的.我在想我可能不得不使用反思.

编辑!不知道在XP中是否可能,可能需要vista API

谢谢.

解决方法

今天,我从Vista图标中提取了256×256位图.

像Nathan W一样,我使用它在“关于”框中显示大图标作为位图.例如,此代码将Vista图标作为PNG图像,并将其显示在256×256 PictureBox中:

picBoxApplogo.Image = ExtractVistaIcon(myIcon);

功能将Icon对象作为参数.所以,您可以使用任何图标 – 从资源,文件,流等. (请阅读下面关于提取EXE图标).

它运行在任何操作系统上,因为它不使用任何Win32 API,它是100%托管代码:-)

// Based on: http://www.codeproject.com/KB/cs/IconExtractor.aspx
// And a hint from: http://www.codeproject.com/KB/cs/IconLib.aspx

Bitmap ExtractVistaIcon(Icon icoIcon)
{
    Bitmap bmpPngExtracted = null;
    try
    {
        byte[] srcBuf = null;
        using (System.IO.MemoryStream stream = new System.IO.MemoryStream())
            { icoIcon.Save(stream); srcBuf = stream.ToArray(); }
        const int SizeICONDIR = 6;
        const int SizeICONDIRENTRY = 16;
        int iCount = BitConverter.ToInt16(srcBuf,4);
        for (int iIndex=0; iIndex<iCount; iIndex++)
        {
            int iWidth  = srcBuf[SizeICONDIR + SizeICONDIRENTRY * iIndex];
            int iHeight = srcBuf[SizeICONDIR + SizeICONDIRENTRY * iIndex + 1];
            int iBitCount   = BitConverter.ToInt16(srcBuf,SizeICONDIR + SizeICONDIRENTRY * iIndex + 6);
            if (iWidth == 0 && iHeight == 0 && iBitCount == 32)
            {
                int iImageSize   = BitConverter.ToInt32(srcBuf,SizeICONDIR + SizeICONDIRENTRY * iIndex + 8);
                int iImageOffset = BitConverter.ToInt32(srcBuf,SizeICONDIR + SizeICONDIRENTRY * iIndex + 12);
                System.IO.MemoryStream destStream = new System.IO.MemoryStream();
                System.IO.BinaryWriter writer = new System.IO.BinaryWriter(destStream);
                writer.Write(srcBuf,iImageOffset,iImageSize);
                destStream.Seek(0,System.IO.SeekOrigin.Begin);
                bmpPngExtracted = new Bitmap(destStream); // This is PNG! :)
                break;
            }
        }
    }
    catch { return null; }
    return bmpPngExtracted;
}

重要!如果要直接从EXE文件加载该图标,则不能使用Icon.ExtractAssociatedIcon(Application.ExecutablePath)作为参数,因为.NET函数ExtractAssociatedIcon()非常愚蠢,它只能提取32×32图标!

相反,您最好使用由Tsuda Kageyu(http://www.codeproject.com/KB/cs/IconExtractor.aspx)创建的整个IconExtractor类.您可以稍微简化这个类,使其更小.这样使用IconExtractor:

// Getting FILL icon set from EXE,and extracting 256x256 version for logo...
using (TKageyu.Utils.IconExtractor IconEx = new TKageyu.Utils.IconExtractor(Application.ExecutablePath))
{
    Icon icoAppIcon = IconEx.GetIcon(0); // Because standard System.Drawing.Icon.ExtractAssociatedIcon() returns ONLY 32x32.
    picBoxApplogo.Image = ExtractVistaIcon(icoAppIcon);
}

注意:我仍然使用我的ExtractVistaIcon()函数,因为我不喜欢IconExtractor处理这个工作 – 首先,它使用IconExtractor.SplitIcon(icoAppIcon)提取所有图标格式,然后你必须知道确切的256×256图标索引,以获得所需的vista图标.所以,使用我的ExtractVistaIcon()这里是更快更简单的方法:)

原文链接:https://www.f2er.com/csharp/95603.html

猜你在找的C#相关文章