浏览多个文件和文件夹
一篇关于浏览对话框的文章,它可以帮助您选择多个文件和文件夹。
引言
这段代码片段将向您展示如何通过向您的项目添加自定义对话框来选择多个文件和文件夹。 MFC 中有内置控件用于选择文件夹 (SHBrowseForFolder
) 或文件 (CFileDialog
),但您无法使用这些控件选择多个文件夹或文件。在这里,我为您提供一个对话框;您可以从您的应用程序中调用它,并可以一次选择多个文件和文件夹。
本文还将让您了解
- 如何编辑您的资源文件 (.rc 和 Resource.h)
- 如何提取系统图标列表
- 如何遍历 Windows 的文件夹结构
如何使用代码
在这里,您需要做一点工作。 这是一个 MFC 应用程序,并使用一个对话框,因此您必须手动编辑您的 .rc 和 Resource.h 文件,以及您的 App 类。 那么,让我们开始使用代码..
- 将 BrowseDlg.h 和 BrowseDlg.cpp 文件复制到您的项目文件夹。
- 将 BrowseDlg.cpp 的项目头文件从
#include "BrowseForFiles.h"
更改为您的项目头文件。 - 将 BrowseDlg.cpp 中使用的 App 类的名称从
extern CBrowseForFilesApp theApp;
更改为您的 App 类。 在任何出现的地方重复此操作。 - 打开您的项目头文件,并添加以下行作为公共成员
CImageList m_ImgList; CList<CString,CString&> MainDirList;
- 然后,打开您的项目 .cpp 文件,并将以下行添加到
InitInstance()
,在开始执行您的代码之前HIMAGELIST hSystemSmallImageList; SHFILEINFO ssfi; //get a handle to the system small icon list hSystemSmallImageList = (HIMAGELIST)SHGetFileInfo( (LPCTSTR)_T("c:\\"), 0, &ssfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON); m_ImgList.Attach(hSystemSmallImageList);
- 然后,打开您的 Resource.h 文件并在编辑时注意。 将以下行添加到
#define
列表#define IDD_BROWSE 129 #define IDC_PATH 1002 #define IDC_DRIVE 1003 #define IDC_FILES 1004 #define IDC_UP 1005
在这里,您必须注意避免常量重复。 例如,如果 129 或 1003 或上述任何数字已经存在,则必须将数字修改为未被任何其他控件分配的新数字。 在这里,最好的想法是从您的文件中找到最高的三个数字,然后将其提供给
IDD_BROWSE
。 并找到最高的四个数字,并将其分配给IDC_PATH
,并将数字以 1 为增量分配给上述控件。 例如,如果 1023 是分配给控件的最高数字,则修改上述值如下#define IDC_PATH 1024 #define IDC_DRIVE 1025 #define IDC_FILES 1026 #define IDC_UP 1027
因此,您已将控件添加到资源文件。 现在,也修改
APISTUDIO
定义的常量,如下所示将最高的三位数加一 (+1) 给以下变量
#define _APS_NEXT_RESOURCE_VALUE 130
将最高的四位数加一 (+1) 给以下变量
#define _APS_NEXT_CONTROL_VALUE 1028
当您向项目中添加新控件时,
APISTUDIO
将使用这些变量。 - 然后,在文本模式下打开您的 .rc 文件,并将以下代码添加到 Dialog 部分
IDD_BROWSE DIALOG DISCARDABLE 0, 0, 212, 214 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Add Files and Folders" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,112,188,50,14 PUSHBUTTON "Cancel",IDCANCEL,48,187,50,14 EDITTEXT IDC_PATH,7,165,200,16, ES_AUTOHSCROLL | ES_READONLY COMBOBOX IDC_DRIVE,76,13,29,125, CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP CONTROL "List1",IDC_FILES,"SysListView32", LVS_REPORT | WS_BORDER | WS_TABSTOP,7,29,200,122 LTEXT "Drive",IDC_STATIC,51,16,18,8 LTEXT "Path",IDC_STATIC,7,155,16,8 PUSHBUTTON "UP",IDC_UP,114,13,20,14 END
并且还将以下代码添加到
DESIGNINFO
部分IDD_BROWSE, DIALOG BEGIN LEFTMARGIN, 7 TOPMARGIN, 7 BOTTOMMARGIN, 207 END
因此,BrowseDlg
已经可以使用。 在您想要的地方按如下方式调用对话框
CBrowseDlg dlgBrowse; dlgBrowse.DoModal();
在完成对话框的执行后,您将在名为 MainDirList
的 app 变量中获得所选的文件列表。 您可以按如下方式检索 CList
的内容
POSITION position; // Your App class extern CTestBrwsApp theApp; int iCnt = theApp.MainDirList.GetCount(); position = theApp.MainDirList.GetHeadPosition(); for(i = 0; i < iCnt; i++ ) { //m_SelectedList is simply a CListCtrl m_SelectedList.AddString((CString) theApp.MainDirList.GetNext(position)); }
因此我们完成了工作。 如果您有任何疑问,请参考本文附带的示例项目。