代码改变世界

重叠图标处理

2011-11-13 16:33  江上渔者  阅读(684)  评论(0编辑  收藏  举报

图标覆盖是表示在Shell对象图标左下角位置小图像。他们通常被添加到对象的图标来提供一些额外信息。例如,我们通常使用的小箭头图标覆盖指示那个图标代表一个链接,而不是实际文件或文件夹。另外这些标准图标覆盖是由系统提供,您可以为特定Shell对象通过实现和注册一个图标覆盖处理程序来请求自定义图标覆盖。

注:系统能够支持的不同图标覆盖处理程序的数量是由系统图像列表中图标覆盖可用空间总数限制。目前有十五个插槽分配给图标覆盖,其中一些是由系统保留。鉴于此,图标覆盖处理程序应该仅在没有令人满意的替代时才实现。

1、图标覆盖如何工作?

图标覆盖处理程序是与一个特定的图标覆盖相关的组件对象模型(COM)对象。Shell和处理程序之间的所有通信需要通过处理程序的IShellIconOverlayIdentifier接口。

当Shell启动时,它通过调用他们的IShellIconOverlayIdentifier接口的两个方法初始化所有图标覆盖处理:

Shell通过调用IShellIconOverlayIdentifier::GetOverlayInfo请求处理程序图标覆盖的位置。图标覆盖处理程序返回包含覆盖图标的文件的名称,以及他们在文件中的索引。然后,Shell添加这些图标覆盖到系统图像列表。

Shell通过调用IShellIconOverlayIdentifier::GetPriority来确定图标覆盖的优先级。优先级值是从0到100的数字,其中100表示最低优先级。如果有多个图标覆盖被特定文件请求,Shell使用这些值来帮助确定哪个图标覆盖将显示。

在绘画一个对象图标之前,Shell传递对象名称到每个图标覆盖处理程序的IShellIconOverlayIdentifier::IsMemberOf方法。图标覆盖处理程序通常与特定文件分组相关。例如,图标覆盖处理程序可能请求一个文件类型的所有成员的一个覆盖,就像一个.myp文件名扩展的所有文件。如果处理程序想要他的图标覆盖被显示,它返回S_OK。然后Shell调用处理程序IShellIconOverlayIdentifier::GetOverlayInfo方法决定哪个图标将显示。

注:一旦图像已经在初始化期间被加载到系统图像列表,它就不能被改变。初始化之后,文件名和索引被用来仅标识图标覆盖。系统不会加载新图标覆盖。IShellIconOverlayIdentifier::GetOverlayInfo被调用的时候,你的处理程序必须返回方法第一次被调用时指定的一些文件名和索引。

虽然,仅一个图标覆盖可以被显示,但是一个对象是可以通过请求多个处理程序获取图标覆盖。在那种情况下,Shell通过显示最高优先级图标覆盖解决冲突。Shell通过一个内部设置规则解决大多数冲突。如果这些规则不够充分,Shell比较处理程序的IShellIconOverlayIdentifier::GetPriority方法在初始化期间指定的优先级值。

2、注册图标覆盖处理程序

除了正常的COM注册,您还必须在这个键下创建一个子项命名处理程序。

HKEY_LOCAL_MACHINE
Software
Microsoft
Windows
CurrentVersion
Explorer
ShellIconOverlayIdentifiers

设置子项的默认值为对象的类标识(CLSID)全局唯一标识。

下面例子说明了如何注册一个称为MyOverlay的图标覆盖处理程序。

HKEY_LOCAL_MACHINE
Software
Microsoft
Windows
CurrentVersion
Explorer
ShellIconOverlayIdentifiers
MyOverlay
(Default) = {MyOverlay CLSID GUID}

原文链接:http://msdn.microsoft.com/en-us/library/cc144123(v=VS.85).aspx

(如果链接不可用,可以在MSDN中输入“IShellIconOverlayIdentifier interface”搜索)

示例链接:http://www.codeproject.com/KB/shell/overlayicon.aspx

(如果链接不可用,可以在百度中输入“overlayicon codeproject”搜索)