C++打开文件夹对话框之BROWSEINFO
头文件
#include <shlobj.h>
#include <windows.h>
#include <stdio.h>
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中指定的事件,如下所示:
uMsg | lParam |
---|---|
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参数中提供附加信息
Msg | Meaning | wParam | lParam |
---|---|---|---|
BFFM_ENABLEOK | 启用或禁用对话框的OK按钮。 | Not used. | 若要启用,请设置为非零值。若要禁用,请设置为0。 |
BFFM_SETOKTEXT | Version 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_SETEXPANDED | Version 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. | 指向包含所需文本的以空结束的字符串的指针。 |
相关文章:
C++打开文件夹对话框之BROWSEINFO
头文件 #include <shlobj.h> #include <windows.h> #include <stdio.h> using namespace std; 案例 string chooseFile(void) {//用户选择的路径,可以是TCHAR szBuffer[MAX_PATH] {0};然后再使用TCHAR 转char字符串,此处可以直接使…...

Nuxt项目配置、目录结构说明-实战教程基础-Day02
Nuxt项目配置、目录结构说明-实战教程基础-Day02一、Nuxt项目结构1.1资源目录1.2 组件目录1.3 布局目录1.4 中间件目录1.5 页面目录1.6 插件目录1.7 静态文件目录1.8 Store 目录1.9 nuxt.config.js 文件1.10 package.json 文件其他:别名二、项目配置2.1 build2.2 cs…...

单链表的头插,尾插,头删,尾删等操作
前言顺序表要求是具有连续的物理空间,并且数据的话是在这些空间当中是连续的存储。但这样会带来很多问题,比如说在头部或者说中间插入的话,效率不是很高;并且申请空间可能需要扩容,并且越往后一般来说都是异地扩容&…...
Qt扫盲-QProcess理论总结
QProcess理论使用总结一、概述二、使用三、通过 Channel 通道通信四、同步进程API五、注意事项1. 平台特性2. 不能实时读取一、概述 QProcess 其实更多的是与外面进程进行交互的一个工具类,通过这个类来启动外部进程,获取这个进程的标准输出,…...

JAVA进阶 —— Steam流
目录 一、 引言 二、 Stream流概述 三、Stream流的使用步骤 1. 获取Stream流 1.1 单列集合 1.2 双列集合 1.3 数组 1.4 零散数据 2. Stream流的中间方法 3. Stream流的终结方法 四、 练习 1. 数据过滤 2. 数据操作 - 按年龄筛选 3. 数据操作 - 演员信息要求…...

Ubuntu Protobuf 安装(测试有效)
安装流程 下载软件 下载自己要安装的版本:https://github.com/protocolbuffers/protobuf 下载源码编译: 系统环境:Ubuntu16(其它版本亦可),Protobuf-3.6.1 编译源码 cd protobuf# 当使用 git clone 下来的…...

驱动程序开发:FTP服务器和OpenSSH的移植与搭建、以及一些笔记
目录一、FTP服务器移植与搭建1、在ubuntu下安装vsftpd2、在window下安装FileZilla3、移植vsftpd到开发板上4、Filezilla 连接测试5、注意点二、开发板 OpenSSH 移植与使用1、移植 zlib 库2、移植 openssl 库3、移植 openssh 库4、openssh 使用测试三、关于u-boot上的操作及根文…...

优化改进YOLOv5算法之添加GIoU、DIoU、CIoU、EIoU、Wise-IoU模块(超详细)
目录 1、IoU 1.1 什么是IOU 1.2 IOU代码 2、GIOU 2.1 为什么提出GIOU 2.2 GIoU代码 3 DIoU 3.1 为什么提出DIOU 3.2 DIOU代码 4 CIOU 4.1 为什么提出CIOU 4.2 CIOU代码 5 EIOU 5.1 为什么提出EIOU 5.2 EIOU代码 6 Wise-IoU 7 YOLOv5中添加GIoU、DIoU、CIoU、…...

windows电脑pc如何使用svn获取文档和代码
一、安装svn 下载链接 也可通过其他方式下载 二、使用 2.1 随便找一个文件夹 2.2 点击右键,选择SVN Checkout 2.3输入网址 如当你在网页上访问时地址为https://10.197.78.78/!/#aaa/view/head/bbb 在这里不能直接填入,而是 https://10.197.78.78/sv…...

ROS1学习笔记:tf坐标系广播与监听的编程实现(ubuntu20.04)
参考B站古月居ROS入门21讲:tf坐标系广播与监听的编程实现 基于VMware Ubuntu 20.04 Noetic版本的环境 文章目录一、创建功能包二、创建代码2.1 以C为例2.1.1 配置代码编译规则2.1.2 编译整个工作空间2.1.2 配置环境变量2.1.4 执行代码2.2 以Python为例2.2.1 配置代码…...
力扣解法汇总1590. 使数组和能被 P 整除
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 给你一个正整数数组 nums,请你移除 最短 子数组(可以为 …...

Spring源码阅读(基础)
第一章:bean的元数据 1.bean的注入方式: 1.1 xml文件 1.2 注解 Component(自己写的类才能在上面加这些注解) 1.3配置类: Configuration 注入第三方数据源之类 1.4 import注解 (引用了Myselector类下…...

服务搭建篇(九) 使用GitLab+Jenkins搭建CI\CD执行环境 (上) 基础环境搭建
1.前言 每当我们程序员开发在本地完成开发之后 , 都要部署到正式环境去使用 , 在一些传统的运维体系中 , 开发与运维都是割裂的 , 开发人员不允许操作正式服务器 , 服务器只能通过运维团队来操作 , 这样可以极大的提高服务器的安全性 , 不经过安全保护的开放服务器 , 对于黑客…...

CDC 长沙站丨云原生技术研讨会:数字兴链,云化未来!
一、活动信息:活动主题:CDC 长沙站丨云原生技术研讨会活动时间:2023 年 3 月 14 日下午 14:30-17:30活动地点:长沙市岳麓区-拓维信息总部 1 楼多功能厅活动参与方式:免门票参与,戳此…...
A.特定领域知识图谱知识推理方案:知识图谱推理算法综述[二](DTransE/PairRE:基于表示学习的知识图谱链接预测算法)
推荐参考文章: A.特定领域知识图谱知识推理方案:知识图谱推理算法综述[一](基于距离的翻译模型:TransE、TransH、TransR、TransH、TransA、RotatE) A.特定领域知识图谱知识推理方案:知识图谱推理算法综述[二](DTransE/PairRE:基于表示学习的知识图谱链接预测算法) A.…...

香港酒店模拟分析项目报告--使用tableau、python、matlab
转载请标记本文出处 软件:tableau、pycharm、关系型数据库:MySQL 数据大量分析考虑电脑性能的情况。 文章目录前言一、爬虫是什么?二、使用tableau数据可视化1.引入数据1.1 制作直方图-各地区酒店数量条形图1.2 各地区酒店均价1.3 价格等级堆…...

第18天-商城业务(商品检索服务,基于Elastic Search完成商品检索)
1.构建商品检索页面 1.1.引入依赖 <!-- thymeleaf模板引擎 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!-- 热更新 --><…...

5.2 对射式红外传感器旋转编码器计次
对射式红外传感器1.1 接线图VCC GND分别接电源的正负极DO数字输出端,随意选择一个GPIO口1.2 硬件原理当挡光片或者编码盘在对射式红外传感器中间经过时,DO就会输出电平变化信号,电平跳变信号触发STM32 PB14号口中断,在中断函数中执…...
【数据库概论】第九章 关系查询处理和查询优化
第九章 关系查询处理和查询优化 本章主要介绍关系数据库查询管理和查询优化,主要分为代数优化(又称逻辑优化)和物理优化(也称非代数优化)。 9.1 关系型数据库系统的查询处理 查询处理是关系型数据库管理系统执行查询…...
(WIP) my cloud test bed (by quqi99)
作者:张华 发表于:2023-03-10 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 问题 想创建一个local local test bed, 用来方便做各种云实验,如openstack, k8s, ovn, lxd等…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...