SelectDialog - 一个多文件和文件夹选择对话框






3.38/5 (35投票s)
一个多选文件和文件夹浏览窗口。

引言
问题是什么?
您可能需要一个类似 CFileDialog
(MFC) 的对话框,允许您一起选择一些项目。 我不是指多选文件功能,而是多选文件和文件夹。
如果您在 MSDN 和互联网上搜索可以为您执行此操作的库,也许您能找到的最好的东西是用于选择单个或多个文件的 CFileDialog
和用于选择单个文件夹的 SHBrowseForFolder
API。
所以问题是您需要一个实用程序,使选择所有可浏览内容成为可能。
我们应该怎么做才能解决这个问题?
如果您想使用一个单一的类,您可以使用它来选择一个文件或一个文件夹,或者一些文件或一些文件夹,或者它们的混合。 我搜索了这样的实用程序,但什么也没找到。 所以我决定提供它,我发现的最佳解决方案是更改 CFileDialog
以执行我需要的功能。
解决方案
CSelectDialog
是一个从 CFileDialog
继承的类,它使您可以浏览您的计算机或网络并选择文件和文件夹的混合。 为了方便我(作为实施者)和用户,我向类中添加了一个 CStringArray
类型的成员,以在对话框返回 IDOK
后保留选定的项目。
CSelectDialog 和 CFileDialog 的区别
- 它们的用户界面有一些区别(您可以在 Vista 中的示例图像中看到)。
CFileDialog
的OnInitDone
、OnFolderChange
、OnFileNameOK
和WndProc
函数在CSelectDialog
中被重写。
Using the Code
使用 CSelectDialog
类似于 CFileDialog
。 只需定义一个 CSelectDialog
类型的变量并 DoModal
即可。 用户单击“确定”按钮后,您可以通过 m_lstSelectedItems
成员访问所选项目的完整路径。 下面显示了一个执行此操作的代码片段
CSelectDialog ofd(TRUE, _T("*.*"), NULL,
OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT,
_T("All files and folders(*.*)|*.*||") );
if( ofd.DoModal() != IDOK )
return;
for( int i=0; i<ofd.m_SelectedItemList.GetCount(); i++ )
m_lstSelectedItems.AddString( ofd.m_SelectedItemList[i] );
几点说明
-
如果您想禁用多选,您应该在
CSelectDialog
构造函数中进行更改。 -
如果您想隐藏选择对话框下方的
combobox
及其标签,您应该在OnInitDone
函数中取消注释下面的 2 行... //HideControl(cmb13); //HideControl(stc3); ...
-
为了防止 XP SP3 中的异常,您应该注释掉
OnInitDone
函数中所有包含cmb13
的行。
关注点
当我在互联网上搜索时,没有人提供具有此功能的此类浏览对话框。
历史
- 版本 1.0 2008 年 7 月:
SelectDialog
的第一个版本