选择文件夹对话框
在一个项目中用到了选择文件夹对话框,为了方便特意写了函数来显示并返回用户选择的文件夹的路径;其中具体参数的含义可以参考http://tag.csdn.net/tag/browseinfo.xml
调用时只需要:
if( FolderBrowseDialog( strUserSelectPath, TEXT("
选择资源文件夹
"), 0, (LPCTSTR)strCurPath ) )
{
//
用户选择了目录并单击确定
}
int
CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData)//
回调函数
{
if
(uMsg==BFFM_INITIALIZED)
{
//
设置初始目录
if
(lpData)
SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)lpData);
}
return
TRUE;
}
//
显示选择文件夹函数,当然首先需要确认文件夹存在,
//
如果用户选择了取消,返回为假,否则将返回真
BOOL
FolderBrowseDialog(CString &folderSel, //
用户选择的文件夹的路径
LPCTSTR title = 0, //
选择框上方的提示
LPCTSTR root = 0, //
设置初始的根路径
LPCTSTR curSel = 0) //
设置当前选择的目录
{
ITEMIDLIST *ppidl = NULL;
//
设置根目录
if
( root != 0 )
{
OLECHAR szOleChar[MAX_PATH];
LPSHELLFOLDER IpsfDeskTop;
ULONG ulEaten, ulAttribs;
HRESULT hres;
SHGetDesktopFolder(&IpsfDeskTop);
wcscpy( szOleChar, (LPCTSTR)root );
//MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,path,-1,szOleChar,sizeof(szOleChar));
hres = IpsfDeskTop->ParseDisplayName(NULL, NULL, szOleChar, &ulEaten, &ppidl, &ulAttribs);
hres=IpsfDeskTop->Release( );
if
(FAILED(hres)) ppidl = NULL;
}
BROWSEINFO bi;
TCHAR Buffer[MAX_PATH];
//
初始化入口参数
bi
开始
bi.hwndOwner = NULL;
bi.pidlRoot = ppidl;
bi.pszDisplayName = Buffer;//
此参数如为
NULL
则不能显示对话框
bi.lpszTitle = title;
bi.ulFlags = BIF_RETURNONLYFSDIRS;
bi.lParam = (LPARAM)curSel;
bi.lpfn = BrowseCallbackProc;
bi.iImage = 0;
//
初始化入口参数
bi
结束
LPITEMIDLIST pIDList = SHBrowseForFolder(&bi);//
调用显示选择对话框
if
(pIDList)
{
SHGetPathFromIDList(pIDList, Buffer);
folderSel = Buffer;
GlobalFree(pIDList);
return
TRUE;
}
return
FALSE;
}