C++打开文件夹对话框之BROWSEINFO

本文介绍了如何使用WindowsAPI中的SHBrowseForFolder函数创建一个文件选择对话框,让用户选择文件或目录。示例代码展示了如何设置对话框的属性,回调函数以及如何处理用户的选择。BROWSEINFO结构是关键,包含了对话框配置和用户选择信息。
该文章已生成可运行项目,

头文件

#include <shlobj.h>
#include <windows.h>
#include <stdio.h>
using namespace std;

 案例

string beforeChooseFilePath;
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),一般设置为NULL
	bi.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;
        beforeChooseFilePath =strDir;
		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

本文章已经生成可运行项目
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值