CFileDialog类使得用户可以通过弹出的对话框选择一个文件,但却无法实现对文件夹的选择,不过可以通过SHBrowseForFolder实现,但使用它用户看到的将是一个树状控件。
要使用这个函数,首先要弄清楚BROWSEINFO结构:
hwndOwner: handle to the owner window of the dialog box
pidRoot: 指向一个结构的指针,这个指针用来说明在树状控件中开始浏览的文件夹,只有它以及它的子文件夹会显示在对话框 中,可以简单地设置为NULL,这样对话框中将从桌面开始显示
pszDisplayName: 指向一个buffer的指针,用来保存用户选择的文件夹的名称,也可以简单地设置为NULL
lpszTitle:指定对话框的title
ulFlags:设置对话框的选项
BIF_RETURNONLYFSDIRS: 只返回文件系统文件夹,如果用户选择的文件夹不是文件系统的一部分,OK按钮将是灰色的
lpfn: 指向一个回调函数的指针
lParam:如果指定了回碉函数,从对话眶传递给回调函数的参数
ZeroMemory(&bInfo, sizeof(bInfo));
bInfo.hwndOwner = m_hWnd;
TCHAR tchPath[255];
bInfo.lpszTitle = _T(" 请选择路径: ");
bInfo.ulFlags = BIF_RETURNONLYFSDIRS;
LPITEMIDLIST lpDlist;
//用来保存返回信息的IDList,使用SHGetPathFromIDList函数转换为字符串
lpDlist = SHBrowseForFolder(&bInfo) ; //显示选择对话框
if(lpDlist != NULL)
{
SHGetPathFromIDList(lpDlist, tchPath);//把项目标识列表转化成目录
TRACE(tchPath);
}
要使用这个函数,首先要弄清楚BROWSEINFO结构:
hwndOwner: handle to the owner window of the dialog box
pidRoot: 指向一个结构的指针,这个指针用来说明在树状控件中开始浏览的文件夹,只有它以及它的子文件夹会显示在对话框 中,可以简单地设置为NULL,这样对话框中将从桌面开始显示
pszDisplayName: 指向一个buffer的指针,用来保存用户选择的文件夹的名称,也可以简单地设置为NULL
lpszTitle:指定对话框的title
ulFlags:设置对话框的选项
BIF_RETURNONLYFSDIRS: 只返回文件系统文件夹,如果用户选择的文件夹不是文件系统的一部分,OK按钮将是灰色的
lpfn: 指向一个回调函数的指针
lParam:如果指定了回碉函数,从对话眶传递给回调函数的参数
iImage:这个的用处不太清楚
以BROWSEINFO为参数调用SHBrowseForFolder,如果成功,再调用SHGetPathFromIDList从返回的结果中获取到选择的文件夹的全路径
ZeroMemory(&bInfo, sizeof(bInfo));
bInfo.hwndOwner = m_hWnd;
TCHAR tchPath[255];
bInfo.lpszTitle = _T(" 请选择路径: ");
bInfo.ulFlags = BIF_RETURNONLYFSDIRS;
LPITEMIDLIST lpDlist;
//用来保存返回信息的IDList,使用SHGetPathFromIDList函数转换为字符串
lpDlist = SHBrowseForFolder(&bInfo) ; //显示选择对话框
if(lpDlist != NULL)
{
SHGetPathFromIDList(lpDlist, tchPath);//把项目标识列表转化成目录
TRACE(tchPath);
}
//实例
BROWSEINFO bi;
char buffer[MAX_PATH];
ZeroMemory(buffer,MAX_PATH);
bi.hwndOwner=GetSafeHwnd();
bi.pidlRoot=NULL;
bi.pszDisplayName=buffer;
bi.lpszTitle="选择一个文件夹";
bi.ulFlags=BIF_EDITBOX;
bi.lpfn=NULL;
bi.lParam=0;
bi.iImage=0;
LPITEMIDLIST pList=NULL;
if((pList=SHBrowseForFolder(&bi))!=NULL)
{
char path[MAX_PATH];
ZeroMemory(path,MAX_PATH);
SHGetPathFromIDList(pList,path);
GetDlgItem(IDC_EDADD)->SetWindowText(path);
}