您的位置:首页 > 其它

SHBrowseForFolder函数

2014-10-26 10:57 375 查看
①、目录选择对话框:

TCHAR szPath[MAX_PATH] = {0};

BROWSEINFO mBroInfo = {0};

mBroInfo.hwndOwner = m_hWnd;

ITEMIDLIST *pidl = SHBrowseForFolder(&mBroInfo);

if (SHGetPathFromIDList(pidl, szPath)){

SetDlgItemText(IDC_PATH_EDIT, szPath);

}

CoTaskMemFree(pidl);

#####################################################

一般的OpenDialog,得到的是文件夹名称,如果要想实现下面的效果,得到选择的路径,这个时候SHBrowseForFolder就派上用场了。

下面的例子中返回路径,如果没有选,返回"",选择了路径,则返回选择的路径。

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: