头文件
#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

本文介绍了如何使用WindowsAPI中的SHBrowseForFolder函数创建一个文件选择对话框,让用户选择文件或目录。示例代码展示了如何设置对话框的属性,回调函数以及如何处理用户的选择。BROWSEINFO结构是关键,包含了对话框配置和用户选择信息。
最低0.47元/天 解锁文章
725

被折叠的 条评论
为什么被折叠?



