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

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.38/5 (35投票s)

2008年7月22日

CPOL

2分钟阅读

viewsIcon

144264

downloadIcon

7839

一个多选文件和文件夹浏览窗口。

SelectDlg.jpg

引言

问题是什么?

您可能需要一个类似 CFileDialog (MFC) 的对话框,允许您一起选择一些项目。 我不是指多选文件功能,而是多选文件和文件夹。

如果您在 MSDN 和互联网上搜索可以为您执行此操作的库,也许您能找到的最好的东西是用于选择单个或多个文件的 CFileDialog 和用于选择单个文件夹的 SHBrowseForFolder API。
所以问题是您需要一个实用程序,使选择所有可浏览内容成为可能。

我们应该怎么做才能解决这个问题?

如果您想使用一个单一的类,您可以使用它来选择一个文件或一个文件夹,或者一些文件或一些文件夹,或者它们的混合。 我搜索了这样的实用程序,但什么也没找到。 所以我决定提供它,我发现的最佳解决方案是更改 CFileDialog 以执行我需要的功能。

解决方案

CSelectDialog 是一个从 CFileDialog 继承的类,它使您可以浏览您的计算机或网络并选择文件和文件夹的混合。 为了方便我(作为实施者)和用户,我向类中添加了一个 CStringArray 类型的成员,以在对话框返回 IDOK 后保留选定的项目。

CSelectDialog 和 CFileDialog 的区别

  1. 它们的用户界面有一些区别(您可以在 Vista 中的示例图像中看到)。
  2. CFileDialog OnInitDoneOnFolderChangeOnFileNameOK 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] );

几点说明

  1. 如果您想禁用多选,您应该在 CSelectDialog 构造函数中进行更改。

  2. 如果您想隐藏选择对话框下方的 combobox 及其标签,您应该在 OnInitDone 函数中取消注释下面的 2 行

        ...
        //HideControl(cmb13);
        //HideControl(stc3);
        ...
  3. 为了防止 XP SP3 中的异常,您应该注释掉 OnInitDone 函数中所有包含 cmb13 的行。

关注点

当我在互联网上搜索时,没有人提供具有此功能的此类浏览对话框。

历史

  • 版本 1.0 2008 年 7 月:SelectDialog 的第一个版本
© . All rights reserved.