65.9K
CodeProject 正在变化。 阅读更多。
Home

将应用程序的图标分配给应用程序中的所有窗体

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.37/5 (19投票s)

2008年10月5日

CPOL

2分钟阅读

viewsIcon

102894

downloadIcon

1378

如果应用程序中的所有窗口默认都具有与应用程序可执行文件相同的图标,那将是一件很方便的事情。 这是一个技巧:如何轻松地将应用程序的图标分配给所有托管窗体。

引言

在开发应用程序时,如果应用程序的所有窗口默认都具有与应用程序可执行文件相同的图标,通常会很方便。 但是,如果要这样做,则必须在 Visual Studio 中手动为每个窗体分配图标。 如果可执行文件图标已更改,则必须再次重复此操作。 本文介绍了如何使用代码将应用程序的图标分配给应用程序托管的所有窗体的技巧。

它用 C# 编写,可以用作 DLL,用于任何 .NET 语言。

最重要的图标提取代码是从这里获得的。 它只是略微修复和增强。

解决方案

您需要做的就是

  1. 在 Visual Studio 中为您的项目分配一个图标。
  2. IconRoutines 文件夹中包含的类添加到您的项目中,或者在您的项目中引用 IconRoutines.dll
  3. 在应用程序中要设置为与应用程序图标相同的图标的每个窗体构造函数中添加以下行
  4. this.icon = Cliver.IconRoutines.HostIcon;

这将使您的应用程序的窗口具有与应用程序本身相同的图标。 仅此而已。

工作原理

本节针对好奇的人,可以省略。

第一步是获取可执行文件的图标。

在与 .NET Icon 类浪费了一些时间后,我了解到从 EXE 文件(或任何包含图标的文件)中正确提取图标并不是一件简单的事情。 为什么? 因为那里有几个小技巧

  • Icon.ExtractAssociatedIcon 仅从文件中存储的图标中提取一个小图像。
  • Icon.Save 仅以 16 色格式保存图标。

这意味着必须从头开始编写从文件中提取图标的代码。 幸运的是,此类代码已经由 Steve McMahon 完成,只需要进行一些升级。 它从可执行文件中获取图标的图像。 您可以在随附的源代码中找到它。

第二步是从获取的图像创建一个 Icon 类型的对象。 以下代码完成了这项工作

/// <summary>
/// Extract all icon images from the library file like .exe, .dll, etc. 
/// </summary>
/// <param name="file">file where icon is extracted from</param>
/// <returns>extracted icon</returns>
public static Icon ExtractIconFromLibrary(string file)
{
    // .NET Icon Explorer (http://www.vbaccelerator.com/home/NET/
    //                     Utilities/Icon_Extractor/article.asp) is used here.
    Icon icon = null;
    try
    {
        vbAccelerator.Components.Win32.GroupIconResources gir = 
              new vbAccelerator.Components.Win32.GroupIconResources(file);
        if (gir.Count < 0)
            return icon;

        vbAccelerator.Components.Win32.IconEx i = 
              new vbAccelerator.Components.Win32.IconEx();
        if (gir[0].IdIsNumeric)
            i.FromLibrary(file, gir[0].Id);
        else
            i.FromLibrary(file, gir[0].Name);

        icon = i.GetIcon();
    }
    catch (Exception e)
    {
        throw (new Exception("Could not extract the host icon.", e));
        icon = null;
    }
    return icon;
}

/// <summary>
/// Icon of the hosting application.
/// </summary>
public static Icon HostIcon
{
    get
    {
        if (_HostIcon == null)
            _HostIcon = IconRoutines.ExtractIconFromLibrary(
                        Application.ExecutablePath);
        return _HostIcon;
    }
}
static Icon _HostIcon = null;

现在,我们只需要将 IconRoutines.HostIcon 分配给窗体的图标。

使用代码

在随附的代码中,您可以找到

  • 一个项目 IconRoutines,其中包含图标管理的代码。 您可以将其编译为 DLL 并链接到您的项目;否则,将 IconRoutines 的代码添加到您的代码中。
  • 项目 Test,引用 IconRoutines.dll 并使用它。

祝您开心!

© . All rights reserved.