65.9K
CodeProject 正在变化。 阅读更多。
Home

浏览多个文件和文件夹

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.09/5 (4投票s)

2006年11月3日

CPOL

3分钟阅读

viewsIcon

53275

downloadIcon

1174

一篇关于浏览对话框的文章,它可以帮助您选择多个文件和文件夹。

Sample Image

引言

这段代码片段将向您展示如何通过向您的项目添加自定义对话框来选择多个文件和文件夹。 MFC 中有内置控件用于选择文件夹 (SHBrowseForFolder) 或文件 (CFileDialog),但您无法使用这些控件选择多个文件夹或文件。在这里,我为您提供一个对话框;您可以从您的应用程序中调用它,并可以一次选择多个文件和文件夹。

本文还将让您了解

  • 如何编辑您的资源文件 (.rcResource.h)
  • 如何提取系统图标列表
  • 如何遍历 Windows 的文件夹结构

如何使用代码

在这里,您需要做一点工作。 这是一个 MFC 应用程序,并使用一个对话框,因此您必须手动编辑您的 .rcResource.h 文件,以及您的 App 类。 那么,让我们开始使用代码..

  1. BrowseDlg.hBrowseDlg.cpp 文件复制到您的项目文件夹。
  2. BrowseDlg.cpp 的项目头文件从 #include "BrowseForFiles.h" 更改为您的项目头文件。
  3. BrowseDlg.cpp 中使用的 App 类的名称从 extern CBrowseForFilesApp theApp; 更改为您的 App 类。 在任何出现的地方重复此操作。
  4. 打开您的项目头文件,并添加以下行作为公共成员
    CImageList m_ImgList;
    CList<CString,CString&> MainDirList;
  5. 然后,打开您的项目 .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);
    
    
  6. 然后,打开您的 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 将使用这些变量。

  7. 然后,在文本模式下打开您的 .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));
}

因此我们完成了工作。 如果您有任何疑问,请参考本文附带的示例项目。

© . All rights reserved.