驱动器选择列表控件






4.71/5 (12投票s)
1999年11月30日
3分钟阅读

138605

1524
一个像 Explorer 一样显示驱动器名称和图标的控件。
引言
我最近看到了 Wilfried Roemer 的文章 "驱动器的下拉列表框",很喜欢它的外观。它使用了 shell 函数 SHGetFileInfo 来显示卷标,以及与资源管理器相同的图标。在我看来,像这样的小细节,应用程序呈现的数据与 Windows 本身一样,表明程序员的用心和对操作系统功能的良好理解。因此,受这篇文章的启发,我开发了一个类似的驱动器选择器,但这次使用的是列表视图控件。上面显示了控件可以执行的操作示例。
我的驱动器选择器具有以下功能:
- 显示与资源管理器中相同的名称和图标。(请注意,上面的控件显示了我为 C: 和 D: 驱动器设置的自定义图标。)
- 可配置为显示硬盘驱动器、可移动驱动器、CD、网络驱动器、RAM 驱动器或任何组合。
- 显示小图标或大图标
- 使用列表控件的复选框样式,允许选择多个驱动器。
CDrivePickerListCtrl 是在 Win 98 上的 MSVC 6.0 SP2 中编写的。 我还在 NT 4 上的 Unicode 中对其进行了测试。
在对话框中使用驱动器选择器
在对话框中使用该控件时,您按照正常步骤,使用 ClassWizard 将对话框类的成员变量与列表控件关联。然后在您的头文件中,将 CListCtrl 更改为 CDrivePickerListCtrl。 在第一次调用 DoDataExchange()
之后(通常在 CDialog::OnInitDialog()
中完成),您可以通过该成员变量控制驱动器选择器列表。 您调用的初始化函数会自动设置列表视图样式,因此您不必自己在对话框编辑器中设置它们。
设置列表
只有一个函数用于初始化列表
void InitList ( int nIconSize, DWORD dwFlags )
此函数填充列表控件。 nIconSize 可以是 16 或 32,这将使列表分别显示小图标或大图标。 dwFlags 控制列表中显示的驱动器类型。 这些标志是
DDS_DLIL_HARDDRIVES
: 硬盘驱动器
DDS_DLIL_CDROMS
: CD-ROM 驱动器
DDS_DLIL_REMOVABLES
: 其他可移动驱动器(软盘、Zip 等)
DDS_DLIL_NETDRIVES
: 映射和连接的网络驱动器
DDS_DLIL_RAMDRIVES
: RAM 驱动器
DDS_DLIL_ALL_REMOVABLE
: CD-ROM 和其他可移动驱动器
DDS_DLIL_ALL_LOCAL_DRIVES
: 除了网络驱动器之外的所有驱动器
DDS_DLIL_ALL_DRIVES
: 系统上的所有驱动器。
您还可以使用 SetSelection()
函数设置选中哪些驱动器
void SetSelection ( const DWORD dwDrives )
void SetSelection ( LPCTSTR szDrives )
第一个版本将 dwDrives
视为标志:位 0 确定驱动器 A: 的选中状态(0 表示未选中,1 表示选中),位 1 确定驱动器 B: 的状态,依此类推。 第二个函数接受驱动器字母列表(例如,“ACDX”)。 列出的驱动器被选中,而所有其他驱动器都未选中。
检索选定的驱动器
CDrivePickerListCtrl 提供了三个用于获取所选驱动器的函数。 第一个返回选定的驱动器数。
BYTE GetNumSelectedDrives() const
其他函数类似于 SetSelection()
; 它们以 DWORD 或字符串形式返回所选的驱动器。
void GetSelectedDrives ( DWORD* pdwSelectedDrives ) const
void GetSelectedDrives ( LPTSTR szSelectedDrives ) const
第一个版本返回打包到 DWORD 中的所选驱动器。 第二个版本返回一个字符串,其中包含所选驱动器的字母(始终为大写)。
注释
您可能会注意到,您可以在列表中显示的五种类型的驱动器与 GetDriveType()
的返回值相对应,该值在枚举驱动器时由控件在内部使用。 在我在 Win 98 上进行的测试中,GetDriveType()
返回DRIVE_FIXED对于 RAM 驱动器,而不是预期的DRIVE_RAMDISK。 我不知道这是 API 错误、98 错误还是文档错误; 我无法在 Microsoft 的知识库中找到有关它的提及。 目前,我还没有采取措施来解决这种差异,直到我在其他版本的 Windows 上尝试该代码。
演示项目
我上面包含了一个示例项目,说明了如何使用 CDrivePickerListCtrl。 与往常一样,欢迎提出建议和错误报告。