浏览文件夹_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 对话框这个结构体,缺点就是对话框标题与对话框的间距很大。若想调整间距,得自己去写一个类似浏览文件的对话框。我没有自己写过,因为只为这一个功能去实现,有一些得不偿失。

四、参考资料

参考资料全部来源于网络

标签: