主要函数:
1、SHBrowseForFolder
WINSHELLAPI LPITEMIDLIST WINAPI SHBrowseForFolder(
LPBROWSEINFO lpbi
);
参数lpbi是指向BROWSEINFO结构的指针,该结构用来设置要弹出的浏览框的相关参数,说明如下:
typedef struct _browseinfo {
HWND hwndOwner; //Handle to the owner window for the dialog box(这句话E文更好懂,呵呵)
LPCITEMIDLIST pidlRoot; //浏览的根目录,只有以指定目录为根的目录树会出现在浏览框中。取值NULL,则是桌面
LPSTR pszDisplayName; //用来保存选择的文件夹名称的缓冲
LPCSTR lpszTitle; //框框的标题栏下面的说明文字,想显什么就填什么
UINT ulFlags; //样式旗标;
/*关于旗标选几个常用值说明一下:
BIF_BROWSEINCLUDEFILES:既显示文件夹,也显示夹里的文件;为指定该选项时一般只能看到文件夹,看不到其下的文件
BIF_RETURNONLYFSDIRS:只在用户选择文件系统下的文件夹时能点“确定”
*/
BFFCALLBACK lpfn; //回调,这里不管
LPARAM lParam; //上面那个回调函数的参数,不管
int iImage; //框中条目相关的图标,不管,设为0
} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO;
返回值:
若选了“确定”,则是选择的那个文件夹对应的ItemList,SHGetPathFromIDList用它来得到相应路径
若选了“取消”,则是NULL
2、SHGetPathFromIDList
//--------------------------------------------------
e.g
void CXXDlg::OnButtonAddfold()
{
// TODO: Add your control notification handler code here
BROWSEINFO bi;
bi.hwndOwner = GetSafeHwnd();
bi.iImage = 0;
bi.lParam = NULL;
bi.lpfn = NULL;
bi.lpszTitle = _T("请选择一个文件或文件夹");
bi.pidlRoot = NULL;
bi.pszDisplayName = NULL;
bi.ulFlags = BIF_BROWSEINCLUDEFILES;
LPITEMIDLIST pList = SHBrowseForFolder(&bi);
if(NULL != pList)
{
TCHAR szPath[MAX_PATH] = {0};
SHGetPathFromIDList(pList, szPath);//此时szPath保存了选定的文件夹或文件的路径
//利用szPath来做些事
}
}