网络上大部分给出的方法都只能获取选择的文件夹名称,获取不到完成的路径(至少我的尝试都没能成功...)
下边的方法是参照MSDN上给出的例子编写的
#pragma once
#include <Windows.h>
#include <Shlobj.h>
#pragma comment(lib, "Shell32.lib");
class FolderBrowserDialog
{
public:
FolderBrowserDialog(void);
int Flags;
HWND Owner;
TCHAR* SelectedPath;
TCHAR* Title;
bool ShowDialog();
};
#include "stdafx.h"
#include "FolderBrowserDialog.h"
FolderBrowserDialog::FolderBrowserDialog(void)
{
this->Flags = BIF_USENEWUI;
this->Owner = 0;
this->Title = 0;
}
bool FolderBrowserDialog::ShowDialog(void)
{
BROWSEINFO bi;
memset(&bi, 0, sizeof(bi));
bi.hwndOwner = this->Owner;
bi.lpszTitle = this->Title;
bi.ulFlags = this->Flags;
OleInitialize(NULL);
LPITEMIDLIST pIDL = SHBrowseForFolder(&bi);
if (pIDL == NULL)
{
return false;
}
TCHAR *buffer = new TCHAR[MAX_PATH];
if(!SHGetPathFromIDList(pIDL, buffer) != 0)
{
CoTaskMemFree(pIDL);
return false;
}
this->SelectedPath = buffer;
CoTaskMemFree(pIDL);
OleUninitialize();
return true;
}
使用方法如下
void CTestParseDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
CString sDir;
GetDlgItemText(IDC_EDIT2,sDir);//可扩展个返回string
std::string strDir = CW2A(sDir.GetBuffer(0));
FolderBrowserDialog *folderBrowserDialog1 = new FolderBrowserDialog();
//folderBrowserDialog1->Flags &= ~BIF_USENEWUI;
folderBrowserDialog1->Flags |= BIF_USENEWUI;
folderBrowserDialog1->Flags |= BIF_RETURNONLYFSDIRS;
folderBrowserDialog1->Title = _T("Choose a folder please. Or try to create new ;)");
if (folderBrowserDialog1->ShowDialog())
{
SetDlgItemText(IDC_EDIT2,folderBrowserDialog1->SelectedPath);
}
}
效果如下: