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等…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
