不多说了,直接贴出函数:
///
// 功能:弹出一个文件夹选择对话框
// 返回:用户选择的文件夹路径
//
CString GetSavePath()
{
#define BIF_NEWDIALOGSTYLE 0x00000040 // 因为vc6.0不支持BIF_NEWDIALOGSTYLE,vs2003以上无此问题(此句可删掉)
CString strpath;
TCHAR Buffer[MAX_PATH];
BROWSEINFO bi;
ZeroMemory(&bi, sizeof(BROWSEINFO));
bi.hwndOwner = NULL;
bi.ulFlags = BIF_RETURNONLYFSDIRS; //要求返回文件系统的目
bi.ulFlags=BIF_NEWDIALOGSTYLE; //窗口可以调整大小,有新建文件夹按钮
bi.pszDisplayName = Buffer; //此参数如为NULL则不能显示对话框
bi.lpszTitle = _T("请选择文件夹");
bi.lpfn = NULL;
bi.iImage=IDR_MAINFRAME;
LPITEMIDLIST pIDList = SHBrowseForFolder(&bi);//调用显示选择对话框
if(pIDList)
{
SHGetPathFromIDList(pIDList, Buffer);
//取得文件夹路径到Buffer里
strpath.Format(_T("%s"), Buffer);
}
else
{
strpath = _T(""); // 用户点了取消
}
LPMALLOC lpMalloc;
if(FAILED(SHGetMalloc(&lpMalloc)))
strpath = _T("");
//释放内存
lpMalloc->Free(pIDList);
lpMalloc->Release();
return strpath;
}
以下是几点说明:
1、主要用到了一个API,即LPITEMIDLIST WINAPI SHBrowseForFolder( LPBROWSEINFO lpbi);
2、上述API参数的结构定义:
typedef struct _browseinfo {
HWND hwndOwner; // 父窗口句柄
LPCITEMIDLIST pidlRoot; // 要显示的文件目录对话框的根(Root)
LPTSTR pszDisplayName; // 保存被选取的文件夹路径的缓冲区
LPCTSTR lpszTitle; // 显示位于对话框左上部的标题
UINT ulFlags; // 指定对话框的外观和功能的标志
BFFCALLBACK lpfn; // 处理事件的回调函数
LPARAM lParam; // 应用程序传给回调函数的参数
int iImage; // 文件夹对话框的图片索引
} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO
3、关于这一句
bi.ulFlags=BIF_NEWDIALOGSTYLE;
vs2003以下不兼容,需要自己添加一句:
#define BIF_NEWDIALOGSTYLE 0x00000040
4、最后,贴张图吧: