有时我们需要获得某个文件夹的路径,而不是文件的路径,这时需要用API函数SHBrowseForFolder来实
现。
函数原型为:
LPITEMIDLIST SHBrowseForFolder(LPBROWSEINFO lpbi);
其中LPBROWSEINFO为BROWSEINFO结构的指针。
BROWSEINFO结构如下:
typedef struct _browseinfo {
HWND hwndOwner;
LPCITEMIDLIST pidlRoot;
LPSTR pszDisplayName;
LPCSTR lpszTitle;
UINT ulFlags;
BFFCALLBACK lpfn;
LPARAM lParam;
int iImage;
} BROWSEINFO;
调用例子如下:
void CTestDlg::OnBtndlg()
{
CString sFolderPath;//用来存储路径
char szPath[MAX_PATH]={0};//用来得到,你选择的活页夹路径,相当于提供一个缓冲区
BROWSEINFO m_bi;
//初始化入口参数bi开始
BIF_RETURNONLYFSDIRS,只有用户选择的是文件夹时“确定”按钮才有效。
BIF_STATUSTEXT 创建一个状态窗口,你可以设置其文本
m_bi.ulFlags=80;实现如图:在文件夹浏览对话框上加一个新建文件夹按钮。
m_bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;
m_bi.hwndOwner = GetSafeHwnd(); //得到父窗口Handle值
m_bi.pidlRoot = NULL;
m_bi.lpszTitle ="网上邻居"; //设置标题
m_bi.lpfn = NULL; //设置标志
m_bi.lParam = NULL;
m_bi.pszDisplayName = szPath; //此参数如为NULL则不能显示对话框
//初始化入口参数bi结束
LPITEMIDLIST pidl = ::SHBrowseForFolder( &m_bi ); //调用显示选择对话框
// 弹出文件夹浏览目录,并选取目录
if ( pidl )
{ //取得文件夹路径到szPath里
if( !::SHGetPathFromIDList ( pidl, szPath ) ) szPath[0]=0;
sFolderPath=szPath; //将路径保存在一个CString对象里
IMalloc * pMalloc = NULL;
if ( SUCCEEDED ( ::SHGetMalloc( &pMalloc ) ) ) // 取得IMalloc分配器接口
{
pMalloc->Free( pidl ); // 释放内存
pMalloc->Release(); // 释放接口
}
}
MessageBox(sFolderPath);
评论