MFC选择文件夹的对话框

时间:2022-01-20 18:31:17

1,目的


提供一个对话框供用户选择一个文件夹路径。


2,原理&实现

先贴上这个工具类的源码:

在你的程序中使用静态方法 CSelectFolderDlg::Show() 就能显示一个选择文件夹的对话框啦,返回的CString就是所选文件夹路径。

/*
文件:SelectFolderDlg.h
说明:提供一个选择文件夹的对话框
*/

#ifndef SELECT_FOLDER_DLG_H
#define SELECT_FOLDER_DLG_H


#ifndef BIF_NEWDIALOGSTYLE
#define BIF_NEWDIALOGSTYLE 0x0040
#endif

class CSelectFolderDlg
{
public:
//创建一个选择文件夹的对话框,返回所选路径
static CString Show()
{
TCHARszFolderPath[MAX_PATH] = {0};
CStringstrFolderPath = TEXT("");

BROWSEINFOsInfo;
::ZeroMemory(&sInfo, sizeof(BROWSEINFO));
sInfo.pidlRoot = 0;
sInfo.lpszTitle = _T("请选择一个文件夹:");
sInfo.ulFlags = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE | BIF_EDITBOX;
sInfo.lpfn = NULL;

// 显示文件夹选择对话框
LPITEMIDLIST lpidlBrowse = ::SHBrowseForFolder(&sInfo);
if (lpidlBrowse != NULL)
{
// 取得文件夹名
if (::SHGetPathFromIDList(lpidlBrowse,szFolderPath))
{
strFolderPath = szFolderPath;
}
}
if(lpidlBrowse != NULL)
{
::CoTaskMemFree(lpidlBrowse);
}

return strFolderPath;

}

};

#endif

简单说明下,

有个API可显示一个浏览文件夹的对话框,形式为:

 LPITEMIDLIST WINAPI SHBrowseForFolder( LPBROWSEINFO lpbi);

参数就一个,这个结构定义:

typedef struct _browseinfo {
HWND hwndOwner; // 父窗口句柄
LPCITEMIDLIST pidlRoot; // 要显示的文件目录对话框的根(Root)
LPTSTR pszDisplayName; // 保存被选取的文件夹路径的缓冲区
LPCTSTR lpszTitle; // 显示位于对话框左上部的标题
UINT ulFlags; // 指定对话框的外观和功能的标志
BFFCALLBACK lpfn; // 处理事件的回调函数
LPARAM lParam; // 应用程序传给回调函数的参数
int iImage; // 文件夹对话框的图片索引
} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO

使用函数前我们建一个这个结构,填一些内容,可以对要显示的对话框做些配置:

BROWSEINFO sInfo;
::ZeroMemory(&sInfo, sizeof(BROWSEINFO));
sInfo.pidlRoot = 0;
sInfo.lpszTitle = _T("请选择一个文件夹:");
sInfo.ulFlags = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE | BIF_EDITBOX;
sInfo.lpfn = NULL;

这里设置了对话框显示的目录树根目录、标题、风格等。
现在就可以用它来显示一个“请选择一个文件夹”对话框了:

// 显示文件夹选择对话框
LPITEMIDLIST lpidlBrowse = ::SHBrowseForFolder(&sInfo);
返回的 LPITEMIDLIST 是Windows Shell 用来唯一标识一个对象的结构,这里用它可以获取我们的路径值:

TCHAR szFolderPath[MAX_PATH] = {0};
::SHGetPathFromIDList(lpidlBrowse,szFolderPath);


3,效果

MFC选择文件夹的对话框

MFC选择文件夹的对话框


4,源码


vs2008工程下载:

http://yun.baidu.com/s/1i3wVm3z