加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 06:26:21 所属栏目:百科 来源:网络整理
导读:我有一个应用程序,我已经做了一个256 x 256的远程图标. 我想知道如何使用icx文件中的256×256 png作为应用程序图标,并将其显示在窗体上的图片框中. 我正在使用VB.net,但C#中的答案是正确的.我在想我可能不得不使用反思. 编辑!不知道在XP中是否可能,可能需要
我有一个应用程序,我已经做了一个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()这里是更快更简单的方法:)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读