关于图标

系统在整个用户界面中使用图标来表示文件、文件夹、快捷方式、应用程序和文档等对象。 图标函数使应用程序能够创建、加载、显示、排列、动画和销毁图标。 有关为文件类型指定图标的信息,请参阅 ExtractIcon

本概述提供有关以下主题的信息:

图标热点

图标中的一个像素被指定为 热点,即系统跟踪并识别为图标位置的点。 图标的热点通常是位于图标中心的像素。 如果使用 CreateIconIndirect 函数创建图标,则可以将任何像素指定为热点。

图标类型

操作系统提供一组标准图标,可供任何应用程序随时使用。 软件开发工具包 (SDK) 头文件包含 系统图标 的标识符 - 标识符以 IDI_ 前缀开头。

含义
IDI_APPLICATION
MAKEINTRESOURCE (32512)
默认应用程序图标
IDI_ERROR
MAKEINTRESOURCE (32513)
错误图标
IDI_QUESTION
MAKEINTRESOURCE (32514)
问号图标
IDI_WARNING
MAKEINTRESOURCE (32515)
警告图标
IDI_INFORMATION
MAKEINTRESOURCE (32516)
“信息”图标
IDI_WINLOGO
MAKEINTRESOURCE (32517)
Windows 徽标图标
IDI_SHIELD
MAKEINTRESOURCE (32518)
安全防护图标

有关标准图标的建议用法的信息,请参阅 指南

此外,从 Windows Vista 开始,通过 SHGetStockIconInfo 方法提供了一组额外的标准系统 shell 图标

自定义图标 设计用于特定应用程序,可以是任何设计。 用户可以从文件加载自定义图标或在运行时创建它们。 下面是几个自定义图标。

几个自定义图标

图标大小

系统使用四个图标大小:

  • 系统小型
  • 系统大型
  • Shell small
  • Shell 大型
  • 启动 Windows Vista) 的 Jumbo (

系统小图标显示在窗口描述文字。

有关应用程序首选图标大小的建议,请参阅 图标缩放

更改系统小图标的大小

  1. 在控制面板中,单击“显示”,然后单击“外观”选项卡。
  2. “项目”列表中选择“标题按钮”,然后设置“大小”字段。

检索系统小图标的大小

系统大图标主要由应用程序使用,但它也显示在 Alt+Tab 对话框中。 CreateIconFromResourceDrawIconExtractAssociatedIconExtractIconExtractIconExLoadIcon 函数都使用系统大图标。 系统大图标的大小由视频驱动程序定义,因此无法更改。

检索系统大图标的大小

CreateIconCreateIconFromResourceExCreateIconIndirectSHGetFileInfo 函数可用于处理除系统大小以外的图标。

shell 小图标用于 Windows 资源管理器和常见对话。 目前,这默认为系统较小大小。

检索 shell 小图标的大小

  1. SHGetFileInfo 函数与 配合使用 SHGFI_SHELLICONSIZE | SHGFI_SMALLICON ,检索系统映像列表的句柄。
  2. 然后调用 ImageList_GetIconSize 函数以获取图标大小。

桌面上使用 shell 大图标。

更改大图标的大小

  1. 在 控制面板 中,单击“显示”,然后单击“外观”选项卡,
  2. 从“”列表中选择“图标”,然后设置“大小”字段, (此大小存储在注册表中的“HKEY_CURRENT_USER\Control Panel”下,“Desktop\WindowMetrics\Shell 图标大小”) 。
  3. 单击“加号!”选项卡,然后选择“使用大图标检查框。

检索 shell 大图标的大小

  1. SHGetFileInfo 函数与 SHGFI_SHELLICONSIZE 配合使用,检索系统映像列表的句柄。
  2. 然后调用 ImageList_GetIconSize 函数以获取图标大小。

填写要用于注册窗口类的 WNDCLASSEX 结构时,将 hIcon 成员设置为系统大图标 (通常为 32x32) ,将 hIconSm 成员设置为系统小图标 (通常为 16x16) 。 有关类图标的详细信息,请参阅 类图标

图标创建

标准图标是预定义的,因此无需创建它们。 若要使用标准图标,应用程序可以使用 LoadImage 函数获取其句柄。 图标句柄HICON 类型的唯一值,用于标识标准或自定义图标。

若要为应用程序创建自定义图标,通常使用图形应用程序,并将 ICON 资源 包含在应用程序的资源定义文件中。 在运行时,可以调用 LoadIconLoadImage 来检索图标的句柄。 图标资源可以包含多个不同显示设备的一组图像。 LoadIconLoadImage 会自动从组中为当前显示设备选择最合适的图标。

应用程序还可以在运行时使用 CreateIconIndirect 函数创建自定义图标,该函数基于 ICONINFO 结构的内容创建图标。 GetIconInfo 函数使用热点坐标以及有关图标的位掩码位图和颜色位图的信息填充结构。

应用程序应将自定义图标实现为资源,并且应使用 LoadIconLoadImage,而不是在运行时创建图标。 使用图标资源可避免设备依赖、简化本地化,并使应用程序能够共享图标形状。

CreateIconFromResourceEx 函数使应用程序能够浏览系统的资源,并根据资源数据创建图标和游标。 CreateIconFromResourceEx 基于来自其他可执行文件或 DLL 的二进制资源数据创建图标。 应用程序必须在此函数前面调用 LookupIconIdFromDirectoryEx 函数和多个资源函数。 LookupIconIdFromDirectoryEx 返回当前显示设备最合适的图标数据的标识符。

图标显示

可以使用 GetIconInfo 函数检索图标的图像,也可以使用 DrawIconEx 函数绘制该图像。 若要绘制图标的默认图像,请在调用 DrawIconEx 时指定DI_COMPAT标志。 如果未指定 DI_COMPAT 标志, DrawIconEx 将使用用户指定的图像绘制图标。

当系统显示图标时,它必须从.exe或.dll文件中提取相应的图标图像。 系统使用以下步骤来选择图标图像:

  1. 选择 RT_GROUP_ICON 资源。 如果存在多个此类资源,系统会使用资源 scrip 中列出的第一个资源。
  2. RT_GROUP_ICON 资源中选择适当的 RT_ICON 映像。 如果存在多个映像,系统会使用以下条件来选择一个映像:
    • 选择最接近所请求大小的图像。
    • 如果存在两个或多个该大小的图像,则会选择与显示器的颜色深度匹配的图像。
    • 如果没有图像与显示器的颜色深度完全匹配,则选择颜色深度最大且不超过显示器颜色深度的图像。 如果全部超出颜色深度,则选择颜色深度最低的颜色深度。

注意

系统将 8 或更多 bpp 的所有颜色深度视为相等。 因此,在同一资源中包括 16x16 256 色图像和 16x16 16 色图像没有优势, 系统只需选择它遇到的第一个图像。 当显示器处于 8 bpp 模式时,系统将选择 16 色图标,而选择 256 色图标,并使用系统默认调色板显示所有图标。

 

若要显示动画图标,请使用静态控件,如以下代码片段所示。

hIcon = LoadImage(NULL, "ico.ani", IMAGE_ICON, 0, 0, LR_LOADFROMFILE);
SendMessage( hStatic, STM_SETIMAGE, IMAGE_ICON, (LPARAM)(UINT)hIcon);

图标销毁

当应用程序不再需要使用 CreateIconIndirect 函数创建的图标时,它应销毁该图标。 DestroyIcon 函数会销毁图标句柄,并释放图标使用的任何内存。 应用程序应仅将此函数用于使用 CreateIconIndirect 创建的图标;无需销毁其他图标。

图标重复

CopyIcon 函数复制图标句柄。 这使应用程序或 DLL 能够获取另一个模块拥有的图标的自己的句柄。 然后,如果释放了另一个模块,则复制该图标的应用程序仍将能够使用该图标。

CopyImage 函数基于指定的源图标创建新图标。 新图标可以大于或小于源图标。

有关在可执行文件 (.exe) 文件中添加、删除或替换图标资源的信息,请参阅 资源

DuplicateIcon 函数会生成图标的实际副本。