参考
https://www.cnblogs.com/Hisin/archive/2012/02/27/2370614.html
https://www.cnblogs.com/ranjiewen/p/5697219.html
代码
CString s_save_path;//存放选择的目录
CMutex g_mtx;
//选择文件夹对话框回调函数
int CALLBACK BrowseCallBackFun(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
switch (uMsg)
{
case BFFM_INITIALIZED: //选择文件夹对话框初始化
//设置默认路径为lpData即'D:\'
::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData);
//在STATUSTEXT区域显示当前路径
::SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, lpData);
//设置选择文件夹对话框的标题
::SetWindowText(hwnd, TEXT("请先设置个工作目录"));
break;
case BFFM_SELCHANGED: //选择文件夹变更时
{
TCHAR pszPath[MAX_PATH];
//获取当前选择路径
SHGetPathFromIDList((LPCITEMIDLIST)lParam, pszPath);
//在STATUSTEXT区域显示当前路径
::SendMessage(hwnd, BFFM_SETSTATUSTEXT, TRUE, (LPARAM)pszPath);
}
break;
}
return 0;
}
void OnSelectPath(){
g_mtx.Lock();
char szPath[MAX_PATH]; //存放选择的目录路径
//CString str;
char* tmp = s_save_path.GetBuffer();//获取上一次路径,CString->char*
ZeroMemory(szPath, sizeof(szPath));
BROWSEINFO bi;
bi.hwndOwner = this->GetSafeHwnd();
bi.pidlRoot = NULL;
bi.pszDisplayName = szPath;
bi.lpszTitle = "请选择需要打包的目录:";
bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_STATUSTEXT;
bi.lpfn = BrowseCallBackFun;//回调函数
bi.lParam = (LPARAM)TEXT(tmp);//上一次路径
bi.iImage = 0;
//弹出选择目录对话框
LPITEMIDLIST lp = SHBrowseForFolder(&bi);
if (lp && SHGetPathFromIDList(lp, szPath))
{
//str.Format("选择的目录为 %s", szPath);
s_save_path.Format("%s", szPath);//获得新路径
//AfxMessageBox(str);
}
else
AfxMessageBox("无效的目录,请重新选择");
g_mtx.Unlock();
}