Windows 的资源管理器想必大家都用过,该程序的窗口一分为二,左边的窗口显示本机
当前所有驱动器以及驱动器中的所有文件夹,当用户单击文件夹后,如果该文件夹下面还
有子文件夹,则上层文件夹展开显示下级的文件夹;否则,右边的窗口显示选择文件夹下
的文件。那么这个程序是如何实现的呢?为了说明这个问题,本实例打造了一个简易的资
源管理器,它实现了 Windows 资源管理器的主要功能,在显示文件的属性(如文件的文件
名、文件的大小、文件的创建时间)的同时,还可以改变文件显示的方式,如大小图标方
式、列表方式等。对于 Visual C++初学者来说,这个实例和《实例 2:打造自己的 IE 浏览
器》要结合起来细细的学习、消化,这两个实例包含了 Visual C++编程中的很多细节知识,
如工具栏的处理、树型控件/列表控件的使用、窗口的拆分、字符串的处理等,相信读者朋
友可以从中学到很多知识点。
一、 实现方法
从上面的界面效果图可以看出,在程序中使用了拆分窗口,在拆分的过程中,左边窗
口 为 CTreeView 类 的 子 类 CLeftView , 右 边 的 窗 口 为 CListView 类 的 子 类
CdriveExplorerView。窗口的拆分和 CTreeView、CListView 类不是本实例讲述的重点,相
关的知识在本书的实例中都有介绍,读者朋友可以参阅上述内容及实例的原代码,这里主
要介绍程序中一些具体的细节知识。
资源管理器中一个重要的问题是如何得到本机中的驱动器信息,微软提供的有关驱动
器的 API 函数有 GetLogicalDrives(),GetDriveType()。
对于喜欢操作位和字节的汇编语言使用者来说, GetLogicalDrives()是个很好用的
API 函数。它以位掩码的形式返回逻辑驱动器。即在一个 DWORD 类型的返回值中,位
0(最小的一位)表示驱动器 A,位 1 表示驱动器 B,以此类推。每一个位的状态如果是
on,则表示对应的逻辑驱动器存在;否则状态为 off,表示对应的逻辑驱动器不存在。大家
知道 DWORD 是一个 32 位的值,足以包括所有的英文字母,也就是说最多可有 26 个盘符。
为了确定某个逻辑驱动器的类型,必须调用 GetDriveType()函数。它以路径名作为
参数(如 C:\),返回 DRIVE_FIXED,DRIVE_REMOVABLE,或 DRIVE_UNKNOWN。
下面列出了所有可能返回的值:这些值在 winbase.h 定义
#define DRIVE_UNKNOWN 0 // 无效路径名
#define DRIVE_NO_ROOT_DIR 1 // 无效路经,如无法找到的卷标
#define DRIVE_REMOVABLE 2 // 可移动驱动器(如磁盘驱动器,光驱等)
#define DRIVE_FIXED 3 // 固定的驱动器 (如 通常的硬盘)
#define DRIVE_REMOTE 4 // 网络驱动器
#define DRIVE_CDROM 5 // CD-ROM
#define DRIVE_RAMDISK 6 // 随机存取(RAM) 磁盘
有了驱动器的信息,就可以使用 FindFirstFile()、FindNextFile()等函数来获取驱
动器下面的文件或文件夹信息(相关内容参加《实例:修改文件或文件夹的属性》),然
后分别添加到树型视图和列表视图中。