要实现点击按钮弹出浏览文件夹对话框,可以使用BROWSEINFO结构体和SHBrowseForFolder()方法 通过BROWSEINFO来设置浏览文件夹的属性。下面我就来简单谈一些我在调用的时候遇到的问题和使用的方法。
效果图如下:
首先是BROWSEINFO 参数的含义:
typedef struct _browseinfo {
HWND hwndOwner; // 父窗口句柄
LPCITEMIDLIST pidlRoot; // 要显示的文件夾的根(Root)
LPTSTR pszDisplayName; // 保存被选取的文件夾路径的缓冲区
LPCTSTR lpszTitle; // 显示位于对话框左上部的标题
UINT ulFlags; // 指定对话框的外观和功能的標志
BFFCALLBACK lpfn; // 处理事件的回调函数
LPARAM lParam; // 应用程序传给回调函数的参数
int iImage;// 保存被选取的文件夾的图片索引
} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO
1.BROWSEINFO 结构体参数赋值
BROWSEINFO bi;
这里讲下常用的几个参数的设置:
1).修改打开时的根目录,用到参数2
//此处CSIDL_DRIVES为获取的是我的电脑的ID,用这个参数设置根目录就是我的电脑,参考MSDN,有很多参数
SHGetSpecialFolderLocation(m_hWnd, CSIDL_DRIVES ,&ppidl);
//常用有CSIDL_DESKTOP(桌面)CSIDL_PROGRAMS(开始菜单)CSIDL_MYMUSIC(我的音乐)
然后把ppidl设置到第二个参数,就可以了。
2).修改对话框属性,用到参数5
//MSDN中给出了几个参数使用过程中互斥的情况
ulFlags的值常用可以是 BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE ;
3).设置默认选择目录 需要用到两个参数。参数6,和7。一个是回调函数,一个是LPARAM(回调参数)。
回调函数如下:
static int CALLBACK _SHBrowseForFolderCallbackProc( HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData )
{
switch(uMsg)
{
case BFFM_INITIALIZED:
::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,lpData); //传递默认打开路径 break;
case BFFM_SELCHANGED: //选择路径变化,BFFM_SELCHANGED
{
char curr[MAX_PATH];
SHGetPathFromIDList((LPCITEMIDLIST)lParam,(LPWSTR)(LPCTSTR)curr);
::SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)&curr[0]);
}
break;
default:
break;
}
return 0;
}
LPARAM参数如下:
TCHAR szPath[MAX_PATH] ;//初始化时浏览文件夹的路径
_tcscpy_s(szPath,strCurrentPath);//自己设置的文件夹路径
bi.lParam =LPARAM(szPath); //设置默认路径
二.注意:
设置根目录的时候,当 ulFlags的属性为BIF_NEWDIALOGSTYLE新建文件夹的样式的时候这个属性会收到影响,会出现设置无效的现象。注意取舍。
三.实现源代码如下:
BROWSEINFO bi;
wchar_t Buffer[MAX_PATH];
wchar_t szResult[MAX_PATH];
ITEMIDLIST *ppidl;
wchar_t strCurrentPath[MAX_PATH]= L"C:\\";
SHGetSpecialFolderLocation(m_hWnd, CSIDL_DRIVES ,&ppidl);
if ( ppidl == NULL)
AfxMessageBox(_T("启动路径浏览失败") ) ;
TCHAR szPath[MAX_PATH] ;//初始化时浏览文件夹的路径
_tcscpy_s(szPath,strCurrentPath);//自己设置的文件夹路径
//初始化入口参数bi开始
bi.hwndOwner = this->GetSafeHwnd();
bi.pidlRoot =ppidl;//根目录
bi.pszDisplayName = Buffer;//此参数如为NULL则不能显示对话框
bi.lpszTitle = L"Custom Title";//下标题
bi.ulFlags = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE ;
bi.lpfn = _SHBrowseForFolderCallbackProc;
//bi.iImage=IDR_MAINFRAME;
bi.lParam =LPARAM(szPath); //设置默认路径
//初始化入口参数bi结束
LPITEMIDLIST pIDList = SHBrowseForFolder(&bi);//调用显示选择对话框
if(pIDList)
{
//取得文件夹路径到Buffer里
SHGetPathFromIDList(pIDList,szResult);
//sFolderPath就是我们选择的路径
}
LPMALLOC lpMalloc;
if(FAILED(SHGetMalloc(&lpMalloc)))
return;
lpMalloc->Free(pIDList);
lpMalloc->Release();