当前位置: 首页 > 图文教程 > 开发语言 > VC++ > Windows 2000 UI 新特点之四:其他类型的外壳扩展

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 Windows 2000 UI 新特点之四:其他类型的外壳扩展


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 145 ::
收藏到网摘: n/a

Windows 2000 UI 新特点之四:其他类型的外壳扩展

原文参见:MSDN Magazine March 2000


编译/赵湘宁

第一部分 Windows 2000 UI 新特点之一:信息条提示(Infotip)
第二部分 Windows 2000 UI 新特点之二:自定义文件夹栏目
第三部分 Windows 2000 UI 新特点之三:搜索管理器

下载源代码

摘要:本文是关于Windows 2000 UI 新特点系列文章的第四篇,探讨几个其它的外壳扩展类型,如外壳执行、图标覆盖、磁盘清理管理程序、使用属性页的文件夹定制、以及上下文菜单。
     Windows 2000 还有三个新的外壳扩展:外壳执行管理器(shell execution handler)、图标覆盖管理器(icon overlay handler)和清理管理器(cleanup handler)。
     所谓“外壳执行”,是提供 IShellExecuteHook 接口的一个模块,这个接口导致自己的代码在某个命令行被外壳经由资源管理器或"运行"对话框处理之前被调用。IShellExecuteHook 接口与WH_SHELL没有什么关系,因为您的代码的执行先于目标程序的启动,而且都是在外壳的地址空间内工作。
     Windows 2000是第一个全面支持图标覆盖的Windows 版本。有关的接口有两个:IShellIconOverlay 和 IShellIconOverlayIdentifier。前者是为显示覆盖的名字空间扩展保留的。后者是允许您定义自制图像用于文件夹图标覆盖的主要接口。 图标覆盖是某种条件下外壳自动在图标左下角绘制的代表文件夹项目的一个小图像。典型的例子是快捷方式图标坐下角的小箭头,以及共享文件夹图标左下角的小手图标。这些用户看到的图标是结合在一起的两个重叠图标。这种机制在Windows 2000中被开放,已不是什么秘密。
    当绘制一个文件夹图标时,资源管理器试图从代表特定文件夹类型的名字空间获得一个IShellIconOverlay指针。如果这个接口存在,名字空间便有机会使用定制的项目。Windows 2000 的平台SDK文档中没有关于IShellIconOverlay 和IShellIconOverlayIdentifier接口的信息,但这两个接口实际上自从Windows 9x 和Windows NT 4.0的桌面更新引入一来就已经存在了。如果您在Windows 9x 和Windows NT 4.0 或更早的 OS 版本上编写代码,请参考 Q192055 文档包含的一些有用的技巧。

清除管理器

    Windows 98发布之初,微软制作了一个叫"磁盘清理(Disk Cleanup)"的实用程序挂在操作系统中(参见图十)。这个工具的目的是通过删除、压缩或备份无用的文件来释放磁盘空间。为此,"磁盘清理"的实用程序清除几个标准的文件夹中的内容,如:垃圾箱、下载的程序文件、临时的Internet 文件。

图十 磁盘清理程序

    通过写一个磁盘清理扩展,可以将新的入口增加到图十显示的对话框中以便管理特定的自制应用程序文件集。"磁盘清理"有一个模块化的结构并由一些系统级的处理器构成,您可以编写并注册自己的清理扩展。每一个扩展实现几个COM接口来与"磁盘清理"管理器通讯。
     编写清理扩展必须要创建一个暴露IEmptyVolumeCache2接口的COM对象。Windows 98 和Windows 2000中的清理扩展有一些细微的差别。在Windows 98中必须提供IEmptyVolumeCache接口,而在Windows 2000中还必须提供IEmptyVolumeCache2接口。IEmptyVolumeCache2接口是IEmptyVolumeCache接口的超集并加入了InitializeEx方法。
    下面是本文提供的一个很基本的清理扩展实现:

Cleanup Extension// IEmptyVolumeCache2Impl.h#include <AtlCom.h>#include <emptyvc.h>class ATL_NO_VTABLE IEmptyVolumeCache2Impl : public IEmptyVolumeCache2{public: // IUnknown STDMETHOD(QueryInterface)(REFIID riid, void** ppvObject) = 0; _ATL_DEBUG_ADDREF_RELEASE_IMPL(IEmptyVolumeCache2Impl) // IEmptyVolumeCache::Initialize STDMETHOD(Initialize)(HKEY hkRegKey, LPCWSTR pcwszVolume,