C++打开文件夹对话框之BROWSEINFO
创始人
2024-06-01 01:38:16
0

头文件

#include 
#include 
#include 
using namespace std;

 案例

string chooseFile(void) {//用户选择的路径,可以是TCHAR szBuffer[MAX_PATH] = {0};然后再使用TCHAR 转char字符串,此处可以直接使用char数组类型char dir[MAX_PATH];BROWSEINFO bi;ZeroMemory(&bi,sizeof(BROWSEINFO));ITEMIDLIST *ppidl;//设置根目录SHGetSpecialFolderLocation(NULL, CSIDL_DRIVES, &ppidl);//常用有CSIDL_DESKTOP(桌面)CSIDL_PROGRAMS(开始菜单)CSIDL_MYMUSIC(我的音乐)CSIDL_DRIVES(盘符)bi.hwndOwner = NULL; //父窗口句柄,通常通过AfxGetMainWnd()->GetSafeHwnd()函数获取安全的句柄。bi.pidlRoot = ppidl; //文件夹的根目录,此处为桌面CSIDL_DESKTOP;
//	pidlRoot:显示的文件目录对话框的根(Root),一般设置为NULLbi.pszDisplayName = dir; //保存被选取的文件夹路径的缓冲区bi.lpszTitle = NULL; //显示位于对话框左上部的标题。bi.ulFlags = BIF_BROWSEINCLUDEFILES | BIF_EDITBOX ;//指定对话框的外观和功能的标志
//	bi.ulFlags= BIF_NEWDIALOGSTYLE;//获取程序路径string defaultPath = "";if ("" != beforeChooseFilePath) {defaultPath = beforeChooseFilePath;} else {char buffer[MAX_PATH];GetModuleFileName( NULL, buffer, MAX_PATH);defaultPath = buffer;if (defaultPath.find("\\") != string::npos) {int lastIndex = defaultPath.find_last_of("\\");defaultPath = defaultPath.substr(0, lastIndex);}}
//回调函数,设置默认打开文件夹路径bi.lpfn = BrowseCallbackProc;bi.lParam = (LPARAM) (defaultPath.data());LPITEMIDLIST idl = SHBrowseForFolder(&bi);SHGetPathFromIDList(idl, dir);if (idl && SHGetPathFromIDList(idl, dir)) {string strDir = dir;return strDir;}return "";
}
int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM /*lParam*/,LPARAM lpData) {if (uMsg == BFFM_INITIALIZED) {//(LPARAM)"D:\\remote"--指定初始目录  BFFM_SETSELECTION(指向目录)SendMessage(hwnd, BFFM_SETSELECTION, (WPARAM) TRUE, (LPARAM) lpData);}return 0;
}

说明

BROWSEINFO结构中包含有用户选中目录的重要信息。

BROWSEINFO结构

typedef struct_browseinfo

{

HWND hwndOwner;

LPCITEMIDLIST pidlRoot;

LPSTR pszDisplayName;

LPCSTR lpszTitle;

UINT ulFlags;

BFFCALLBACK lpfn;

LPARAM lParam;

int iImage;

}BROWSEINFO,*PBROWSEINFO,*LPBROWSEINFO;

成员变量

hwndOwner

类型:HWND

对话框的所有者窗口的句柄。

pidlRoot

类型: PCIDLIST_ABSOLUTE

一个 PIDL,指定要从中开始浏览的根文件夹的位置。 只有命名空间层次结构中的指定文件夹及其子文件夹才会显示在对话框中。 此成员可以为 NULL;在这种情况下,将使用默认位置。

pszDisplayName

类型: LPTSTR

指向缓冲区的指针,用于接收用户选择的文件夹的显示名称。 此缓冲区的大小假定为MAX_PATH字符。

lpszTitle

类型: LPCTSTR

指向对话框中树视图控件上方显示的空终止字符串的指针。 此字符串可用于指定用户的说明。

ulFlags

类型: UINT

指定对话框选项的标志。 此成员可以是 0 或以下值的组合。 版本号是指 SHBrowseForFolder 识别在更高版本中添加的标志所需的最低Shell32.dll版本。 有关详细信息,请参阅 Shell 和 Common Controls 版本 。

BIF_RETURNONLYFSDIRS (0x00000001)

0x00000001。 仅返回文件系统目录。 如果用户选择不属于文件系统的文件夹,则 “确定 ”按钮灰显。

注意 “ 确定 ”按钮仍为“\\server”项以及“\\server\share”和目录项启用。 但是,如果用户选择“\\server”项,将 SHBrowseForFolder 返回的 PIDL 传递给 SHGetPathFromIDList 失败。

BIF_DONTGOBELOWDOMAIN (0x00000002)

0x00000002。 不要在对话框的树视图控件中包含域级别下面的网络文件夹。

BIF_STATUSTEXT (0x00000004)

0x00000004。 在对话框中包括状态区域。 回调函数可以通过将消息发送到对话框来设置状态文本。 指定BIF_NEWDIALOGSTYLE时不支持此标志。

BIF_RETURNFSANCESTORS (0x00000008)

0x00000008。 仅返回文件系统上级。 上级是命名空间层次结构中根文件夹下的子文件夹。 如果用户选择不属于文件系统的根文件夹的上级文件夹,则 “确定 ”按钮灰显。

BIF_EDITBOX (0x00000010)

0x00000010。 版本 4.71。 在浏览对话框中包括一个编辑控件,该控件允许用户键入项的名称。

BIF_VALIDATE (0x00000020)

0x00000020。 版本 4.71。 如果用户在编辑框中键入无效的名称,则浏览对话框会使用BFFM_VALIDATEFAILED消息调用应用程序的 BrowseCallbackProc。 如果未指定BIF_EDITBOX,则忽略此标志。

BIF_NEWDIALOGSTYLE (0x00000040)

0x00000040。 版本 5.0。 使用新的用户界面。 设置此标志为用户提供可以调整大小的较大对话框。 该对话框具有多种新功能,包括:对话框中的拖放功能、重新排序、快捷菜单、新文件夹、删除和其他快捷菜单命令。

注意 如果 COM 通过 CoInitializeEx 初始化并设置了COINIT_MULTITHREADED标志,则如果传递BIF_NEWDIALOGSTYLE, SHBrowseForFolder 将失败。

BIF_BROWSEINCLUDEURLS (0x00000080)

0x00000080。 版本 5.0。 浏览对话框可以显示 URL。 还必须设置BIF_USENEWUI和BIF_BROWSEINCLUDEFILES标志。 如果未设置这三个标志中的任何一个,浏览器对话框将拒绝 URL。 即使设置了这些标志,浏览对话框也仅当包含所选项的文件夹支持 URL 时显示 URL。 当调用文件夹的 IShellFolder::GetAttributesOf 方法以请求所选项的属性时,该文件夹必须设置 SFGAO_FOLDER 属性标志。 否则,浏览对话框将不会显示 URL。

BIF_USENEWUI

版本 5.0。 使用新的用户界面,包括编辑框。 此标志等效于BIF_EDITBOX |BIF_NEWDIALOGSTYLE。

注意 如果 COM 通过 CoInitializeEx 初始化并设置了COINIT_MULTITHREADED标志,则如果传递BIF_USENEWUI, SHBrowseForFolder 将失败。

BIF_UAHINT (0x00000100)

0x00000100。 版本 6.0。 与BIF_NEWDIALOGSTYLE结合使用时,请将使用提示添加到对话框,代替编辑框。 BIF_EDITBOX重写此标志。

BIF_NONEWFOLDERBUTTON (0x00000200)

0x00000200。 版本 6.0。 不要在浏览对话框中包括 “新建文件夹 ”按钮。

BIF_NOTRANSLATETARGETS (0x00000400)

0x00000400。 版本 6.0。 当所选项是快捷方式时,返回快捷方式本身的 PIDL 而不是其目标。

BIF_BROWSEFORCOMPUTER (0x00001000)

0x00001000。 仅返回计算机。 如果用户选择计算机之外的任何内容,“确定”按钮就会变灰。

BIF_BROWSEFORPRINTER (0x00002000)

0x00002000。 仅允许选择打印机。 如果用户选择打印机之外的任何内容,“确定”按钮就会变灰。

在 Windows XP 和更高版本中,最佳做法是使用 Windows XP 样式对话框,将对话框的根设置为 打印机和传真 文件夹 (CSIDL_PRINTERS) 。

BIF_BROWSEINCLUDEFILES (0x00004000)

0x00004000。 版本 4.71。 “浏览”对话框显示文件和文件夹。

BIF_SHAREABLE (0x00008000)

0x00008000。 版本 5.0。 浏览对话框可以在远程系统上显示可共享资源。 这适用于希望在本地系统上公开远程共享的应用程序。 还必须设置BIF_NEWDIALOGSTYLE标志。

BIF_BROWSEFILEJUNCTIONS (0x00010000)

0x00010000。 Windows 7 及更高版本。 允许浏览具有.zip文件扩展名的文件夹交接点(如库或压缩文件)。

lpfn

类型: BFFCALLBACK

指向对话框在事件发生时调用的应用程序定义函数的指针。 有关详细信息,请参阅 BrowseCallbackProc 函数。 此成员可以为 NULL

lParam

类型: LPARAM

对话框传递给回调函数的应用程序定义值(如果在 lpfn 中指定)。

iImage

类型: int

一个整数值,该值接收与所选文件夹关联的图像的索引,存储在系统映像列表中。

要求

最低受支持的客户端Windows XP、Windows 7 [仅限桌面应用]
最低受支持的服务器Windows 2000 Server [仅限桌面应用]
标头shlobj_core.h (包括 Shlobj.h、Shlobj_core.h)

BFFCALLBACK 说明

指定一个应用程序定义的回调函数,用于向在调用SHBrowseForFolder时显示的Browse对话框发送消息,并从该对话框处理消息

语法

typedef int ( CALLBACK *BrowseCallbackProc)(  HWND   hwnd,  UINT   uMsg,  LPARAM lParam,  LPARAM lpData );

参数

hwnd
类型:HWND
浏览对话框的窗口句柄。
uMsg
类型:UINT
生成消息的对话框事件。下列值之一。
BFFM_INITIALIZED
对话框已完成初始化。
BFFM_IUNKNOWN
对话框可使用IUnknown接口。
BFFM_SELCHANGED
对话框中的选择已更改。
BFFM_VALIDATEFAILED
用户在对话框的编辑框中输入了无效的名称。不存在的文件夹被认为是无效的名称。
lParam
类型:LPARAM

该值的含义取决于uMsg中指定的事件,如下所示:

uMsglParam
BFFM_INITIALIZED

未使用,值为NULL。

BFFM_IUNKNOWN指向IUnknown接口的指针。
BFFM_SELCHANGED标识新选择项的PIDL。
BFFM_VALIDATEFAILED指向包含无效名称的字符串的指针。应用程序可以在错误对话框中使用此数据,通知用户该名称无效。

lpData
类型:LPARAM
一个应用程序定义的值,在调用SHBrowseForFolder时使用的BROWSEINFO结构的lParam成员中指定。

 返回值


类型:int
返回0,除非bffm_validatfailed。对于该标志,返回0以取消对话框,或返回非0以保持对话框的显示。

备注 

要将BrowseCallbackProc附加到对话框,请在SHBrowseForFolder调用中使用的BROWSEINFO结构的lpfn成员中指定它的地址。
BrowseCallbackProc也可以通过SendMessage向对话框发送消息,来控制这些方面:
OK按钮启用/禁用
OK按钮文本
所选文件夹
扩展文件夹
状态文本
将SendMessage函数的Msg参数设置为以下值之一,为每种消息类型在wParam和lParam参数中提供附加信息

MsgMeaningwParamlParam
BFFM_ENABLEOK启用或禁用对话框的OK按钮。Not used.若要启用,请设置为非零值。若要禁用,请设置为0。
BFFM_SETOKTEXTVersion 6.0 or later. Sets the text that is displayed on the dialog box's OK button.6.0或更高版本。设置对话框的OK按钮上显示的文本。Not used.指向包含所需文本的以空结束的Unicode字符串的指针。
BFFM_SETSELECTION指定要选择的文件夹的路径。路径可以指定为字符串或PIDL。TRUE表示使用字符串;FALSE表示使用PIDL。指定路径的字符串或PIDL。
BFFM_SETEXPANDEDVersion 6.0 or later. Specifies the path of a folder to expand in the Browse dialog box. The path can be specified as a Unicode string or a PIDL.6.0或更高版本。指定要在“浏览”对话框中展开的文件夹的路径。路径可以指定为Unicode字符串或PIDL。TRUE to use a string; FALSE to use a PIDL.指定路径的字符串或PIDL。
BFFM_SETSTATUSTEXT设置状态文本。将BrowseCallbackProc lpData参数设置为指向一个以空结束的字符串,其中包含所需的文本。Not used.指向包含所需文本的以空结束的字符串的指针。

相关内容

热门资讯

安卓系统写脚本软件下载,基于安... 你有没有想过,你的安卓手机或者平板电脑,除了用来刷剧、玩游戏,还能变成一个强大的工作助手呢?没错,就...
安卓系统有哪些机型好,探索顶级... 你有没有想过,安卓系统里的手机型号那么多,哪一款才是最适合你的呢?别急,今天我就来给你好好盘点看看安...
安卓系统之间如何互传,安卓设备... 你是不是也和我一样,手机里存了那么多好东西,却苦于不能和好友分享呢?别急,今天就来教你怎么用安卓系统...
安卓系统启动修改工具,安卓系统... 你有没有想过,你的安卓手机启动速度竟然可以像火箭一样快?没错,这就是今天我要跟你分享的神秘工具——安...
安卓系统版本号历史,从初生到繁... 你有没有发现,每次打开手机,那系统版本号总是一闪而过,好像在悄悄告诉你:“我可是有故事的哦!”今天,...
小米改安卓系统软件,安卓系统软... 你知道吗?最近小米手机界可是掀起了一阵小小的风波呢!那就是小米对安卓系统软件的一次大改版。这可不是什...
安卓系统控制流量app,安卓系... 你有没有发现,手机里的流量就像小河里的水,不知不觉就流光了?别急,今天就来给你揭秘一款神奇的安卓系统...
hl2240安卓系统,功能解析... 你有没有发现,最近你的手机系统更新换代的速度简直就像坐上了火箭呢?今天,就让我带你来一探究竟,看看这...
iqoo刷原生安卓系统,还原纯... 最近手机圈里可是热闹非凡呢!一款名为iqoo的新品手机,凭借其强大的性能和独特的刷机功能,吸引了无数...
安卓系统我的读书入口,我的读书... 亲爱的手机控们,你是否也有这样的体验:每天手机不离手,却总是找不到心仪的读书应用?别急,今天我要给你...
搭载安卓9系统的手机,新一代智... 你有没有发现,最近市面上新出的手机,好像都开始搭载安卓9系统了呢?这可真是让人眼前一亮啊!今天,就让...
电脑模拟安卓系统win7系统,... 你有没有想过,如果电脑也能像手机一样,随时随地都能玩各种游戏、看视频呢?想象你坐在电脑前,屏幕上突然...
华为系统如何退回安卓,轻松实现... 你有没有想过,手机系统就像是我们生活中的衣服,有时候穿久了,就想换一件新的。比如,你之前用了华为的系...
安卓系统定制防沉迷手机,安卓手... 你有没有发现,现在的手机越来越智能,但随之而来的是沉迷于手机的问题也越来越严重,尤其是对青少年来说。...
安卓系统手机顶部符号,功能解析... 你有没有注意到,每次拿起安卓系统手机,顶部那一排小小的符号总是默默守护着你的屏幕?它们就像是一群小精...
美团餐饮系统安卓版,尽享美食新... 你有没有发现,最近点外卖的时候,手机上那个美团餐饮系统安卓版真是越来越方便了!今天,就让我带你来好好...
新生活cms安卓系统进货系统,... 你知道吗?最近市面上出现了一个超级酷的新玩意儿——新生活CMS安卓系统进货系统!这可是个让商家们眼睛...
安卓系统ai文章生成,探索安卓... 你知道吗?现在手机界的风云变幻,安卓系统可是当之无愧的王者!而且,最近听说安卓系统里还悄悄加入了AI...
推荐安卓车载导航系统,安卓平台... 你有没有想过,开车的时候,如果没有导航系统,那可真是像在茫茫大海中航行,没有指南针的感觉呢?别急,今...
安卓系统的地图怎样下载,下载与... 你有没有发现,现在不管去哪里,手机地图都成了我们的好帮手?尤其是安卓系统的地图,功能强大,用起来超级...