下面的例子中返回路径,如果没有选,返回"",选择了路径,则返回选择的路径。
char *GetPath(HWND hWnd,char *pBuffer)
{
BROWSEINFO bf;
LPITEMIDLIST lpitem;
memset(&bf,0,sizeof BROWSEINFO);
bf.hwndOwner=hWnd;
bf.lpszTitle="选择路径";
bf.ulFlags=BIF_RETURNONLYFSDIRS; //属性你可自己选择
lpitem=SHBrowseForFolder(&bf);
if(lpitem==NULL) //如果没有选择路径则返回 0
return "";
//如果选择了路径则复制路径,返回路径长度
SHGetPathFromIDList(lpitem,pBuffer);
return pBuffer;
}
下面我们来解释一下这个函数用到的一些值的含义。
1. BROWSEINFO
它是一个结构, 原型是
typedef struct _browseinfo {
HWND hwndOwner; // 弹出的dialog的父窗体的句柄
LPCITEMIDLIST pidlRoot; // 指向一个ITEMIDLIST的指针,我们会在后边介绍ITEMIDLIST结构,可空
LPSTR pszDisplayName; // 指向一个buffer,这个buffer用来存放用户选中的目录,buffer的size为MAX_PATH
LPCSTR lpszTitle; //指向一个非空的string,用来显示树目录之上的指示信息
UINT ulFlags; // 指出了显示的文件夹的类型
BFFCALLBACK lpfn; //简单的记为NULL
LPARAM lParam; // 当lpfn不为空时,把dialogbox的值传给回调函数lpfn
int iImage; // 系统的图标list的索引,当用户选中目录的时候,得到这个索引
} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO;
ulFlags的可能取值为:
BIF_BROWSEFORCOMPUTER ——只返回"我的电脑",当选中"我的电脑"之外的目录时,OK键为灰色
BIF_BROWSEFORPRINTER ——只返回"打印机",当选中"打印机"之外的目录时,OK键为灰色
BIF_DONTGOBELOWDOMAIN ——不包括"网上邻居"
BIF_RETURNFSANCESTORS ——只返回"我的文件",当选中"我的文件"之外的目录时,OK键为灰色
BIF_RETURNONLYFSDIRS ——同上
BIF_STATUSTEXT ——Includes a status area in the dialog box. The callback can set the status text by sending messages to the dialog box.
2. ITEMIDLIST
是一个结构,指明了默认浏览的根文件夹的位置,可以为空,那样的话,默认为桌面文件夹的文件目录.
原型为
typedef struct _ITEMIDLIST
{
SHITEMID mkid; // list of item identifers
} ITEMIDLIST, * LPITEMIDLIST;
typedef const ITEMIDLIST * LPCITEMIDLIST;
3. SHGetPathFromIDList函数
原型是
WINSHELLAPI BOOL WINAPI SHGetPathFromIDList(
LPCITEMIDLIST pidl,
LPSTR pszPath
);
反正记住配套使用就行了,哈哈~~
如果是在bcb环境中使用,那么如果提示不能识别BROWSEINFO,则需加入头文件#i nclude <ShellAPI.h>
,然后在对应的.cpp的include之前#define NO_WIN32_LEAN_AND_MEAN
来自 http://baby118.blog.163.com/blog/static/727937382009524101746868/?fromdm&fromSearch&isFromSearchEngine=yes