浏览文件夹_browseinfo
一、BROWSEINFO 结构 ....................................................................................
一、BROWSEINFO 结构 ................................................................................................................... 2
●定义....................................................................................................................................... 2
●成员变量 . .............................................................................................................................. 2
二、BROWSEINFO 的使用 ............................................................................................................... 4
(1)新建文件夹 . .................................................................................................................... 4
(2)回调函数 . ........................................................................................................................ 4
(3)LPBROWSEINFO 与BROWSEINFO 的关系 . ..................................................................... 5
三、BROWSEINFO 对话框的缺陷 ................................................................................................... 5
四、参考资料 . .................................................................................................................................. 5
,一、BROWSEINFO 结构
Visual C (VC)中,BROWSEINFO 结构中包含有用户选中目录的重要信息。
(1)BROWSEINFO 结构
●定义
typedef struct_browseinfo
{
HWND hwndOwner;
LPCITEMIDLIST pidlRoot;
LPSTR pszDisplayName;
LPCSTR lpszTitle;
UINT ulFlags;
BFFCALLBACK lpfn;
LPARAM lParam;
int iImage;
}BROWSEINFO,*PBROWSEINFO,*LPBROWSEINFO;
●成员变量
hwndOwner :浏览文件夹对话框的父窗体句柄。
pidlRoot :ITEMIDLIST 结构的地址,包含浏览时的初始根目录,而且只有被指定的目录和其子目录才显示在浏览文件夹对话框中。该成员变量可以是NULL ,在此时桌面目录将被使用。
它指向一个ITEMIDLIST 结构,作为在列表中显示的文件夹的根目录,如果为NULL 則默认为Desktop 。ITEMIDLIST 结构除了用在这里外,它还用作函数的返回值(参看函数原型) 。那为什么不用字符串来表示这个目录呢,这个结构怎样表示一个目录呢? 下面作一个简单的介紹。
ITEMID 和ITEMIDLIST
Windows Shell 的一个功能在于管理并提供方法存取系统中的众多对象,这些对象
,包括了文件,网路上的计算机,控制面板程序,回收站等等,为了识别每一个对像,Windows Shell使用了Item ID来表示它们,而Item ID Lists用来表示一个对像的路径。所以,ITEMID 和ITEMIDLIST 的关系类似于文件名和路径的关系。如果只对文件系统而言的话,ITEMIDLIST 可以看成是路径的另一中表示法,Windows Shell 也提供了函数来进行转化。
BOOL SHGetPathFromIDList( LPCITEMIDLIST pidl, LPSTR pszPath )
这个函数将一个ITEMLIST 转换成文件系统中的路径。
返回值
SHBrowseForFolder 的返回值也是一个指向ITEMIDLIST 的指针。这个ITEMIDLIST 正式表示了用户所选择的文件夹。如上所述,通过SHGetPathFromIDList ,就可以获得一个文件夹Path 的字符串。
要注意的是返回的指针必须由应用程序自己来释放。并且,由于SHBrowseForFolder
是通过调用IMalloc Interface来分配Memory ,所以,也必须通过这个Interface 来释放。 pszDisplayName :用来保存用户选中的目录字符串的内存地址。该缓冲区的大小缺省是定义的MAX_PATH常量宏。
lpszTitle :该浏览文件夹对话框对话框的显示文本,用来提示该浏览文件夹对话框的功能、作用和目的。
ulFlags :该标志位描述了对话框的选项。它可以为0,也可以是以下常量的任意组合: BIF_BROWSEFORCOMPUTER:返回计算机名。除非用户选中浏览器中的一个计算机名,否则该对话框中的“OK ”按钮为灰色。
BIF_BROWSEFORPRINTER:返回打印机名。除非选中一个打印机名,否则“OK ”按钮为灰色。
BIF_BROWSEINCLUDEFILES:浏览器将显示目录,同时也显示文件。
BIF_DONTGOBELOWDOMAIN:在树形视窗中,不包含域名底下的网络目录结构。 BIF_EDITBOX:浏览对话框中包含一个编辑框,在该编辑框中用户可以输入选中项的名字。
BIF_RETURNFSANCESTORS:返回文件系统的一个节点。仅仅当选中的是有意义的节点时,“OK ”按钮才可以使用。
BIF_RETURNONLYFSDIRS:仅仅返回文件系统的目录。例如:在浏览文件夹对话框中,当选中任意一个目录时,该“OK ”按钮可用,而当选中“我的电脑”或“网上邻居”等非有意义的节点时,“OK ”按钮为灰色。
BIF_STATUSTEXT:在对话框中包含一个状态区域。通过给对话框发送消息使回调函数设置状态文本。
BIF_VALIDATE:当没有BIF_EDITBOX标志位时,该标志位被忽略。如果用户在编辑框中输入的名字非法,浏览对话框将发送BFFM_VALIDATEFAILED消息给回调函数。 lpfn :应用程序定义的浏览对话框回调函数的地址。当对话框中的事件发生时,该对话框将调用回调函数。该参数可用为NULL 。
lParam :对话框传递给回调函数的一个参数指针。
iImage :与选中目录相关的图像。该图像将被指定为系统图像列表中的索引值。
,二、BROWSEINFO 的使用
(1)新建文件夹
我们在用“browseinfo ”产生的浏览文件夹的对话框中发现没有“新建文件夹”这一个项目(默认没有) 。如何在“BROWSEINFO ”产生的“浏览文件夹”对话框中加入“新建文件夹”按钮。就是指定BROWSEINFO 结构中的ulFlags 变量为(BIF_NEWDIALOGSTYLE | BIF_EDITBOX)的组合。
例子如下:
#define BIF_NEWDIALOGSTYLE 0x0040
#define BIF_USENEWUI (BIF_NEWDIALOGSTYLE | BIF_EDITBOX) void SelectFolder(HWND hWnd,CString& strSelectPath) {
BROWSEINFO bifolder;
char FileName[MAX_PATH];
ZeroMemory(&bifolder,sizeof(BROWSEINFO));
bifolder.hwndOwner = hWnd;
bifolder.pszDisplayName = FileName;
bifolder.lpszTitle="请选择文件夹";
bifolder.ulFlags= BIF_USENEWUI;
LPITEMIDLIST idl=SHBrowseForFolder(&bifolder);
if(idl==NULL)
return;
SHGetPathFromIDList(idl,FileName);
}
(2)回调函数
此处只针对路径改变做了相应处理,实际中可根据需要进行相应处理。 inline int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
_TCHAR szDir[_MAX_PATH];
switch(uMsg)
{
case BFFM_INITIALIZED: // 初始化
break;
case BFFM_SELCHANGED: // 路径改变
if(SHGetPathFromIDList((LPITEMIDLIST)lParam,szDir))
{
,SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)szDir);
}
break;
default:
break;
}
return 0;
}
(3)LPBROWSEINFO 与BROWSEINFO 的关系
LPBROWSEINFO 是BROWSEINFO 的指针结构,LPBROWSEINFO 只是一个指针,指针必须要指向一个特定的变量,指针才能使用的,即一定要初始化后才可以使用。
三、BROWSEINFO 对话框的缺陷
调用BROWSEINFO 对话框这个结构体,缺点就是对话框标题与对话框的间距很大。若想调整间距,得自己去写一个类似浏览文件的对话框。我没有自己写过,因为只为这一个功能去实现,有一些得不偿失。
四、参考资料
参考资料全部来源于网络