
using namespace std;
namespace BaseFunc
{
// 選擇文件,可設置定位到默認目錄
unsigned selFile( string &strFile, const string &strExt, bool bOpen);
// 選擇目錄,可設置定位初始目錄
unsigned selDir( string &strDir, void *hwnd = NULL);
}
#include <Windows.h>
#include " BaseFunc.h "
using namespace std;
using namespace BaseFunc;
unsigned BaseFunc::selFile( string &strFile, const string &strExt, bool bOpen )
{
string strDir = " D:\\Downloads "; // 這里通過strFile解析目錄,CFileDialog會自動記住
string filename = " hi.txt "; // 通過strFile解析文件名
string filter = strExt + " 文件 (*. " + strExt + " )|*. " + strExt + " || ";
string ext = " . " + strExt;
CFileDialog dlg(bOpen,ext.c_str(),filename.c_str(),OFN_READONLY|OFN_OVERWRITEPROMPT,filter.c_str(),NULL);
dlg.GetOFN().lpstrInitialDir = strFile.c_str(); // 默認目錄
if (dlg.DoModal())
{
strFile = dlg.GetPathName();
return IDOK;
}
return IDCANCEL;
}
int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData)
{
switch(uMsg)
{
case BFFM_INITIALIZED:
::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,lpData);
break;
}
return 0;
}
unsigned BaseFunc::selDir( string &strDir, void *hwnd /* = NULL */ )
{
char szDir[MAX_PATH];
BROWSEINFO bi;
bi.hwndOwner = (HWND)hwnd;
bi.pidlRoot = NULL;
bi.pszDisplayName = szDir;
bi.lpszTitle = " 選擇位置: ";
bi.iImage = 0;
bi.ulFlags = BIF_USENEWUI | BIF_RETURNONLYFSDIRS;
bi.lpfn = BrowseCallbackProc;
bi.lParam = (LPARAM)(LPCTSTR)strDir.c_str();
LPITEMIDLIST lp = SHBrowseForFolder(&bi);
if (lp && SHGetPathFromIDList(lp,szDir))
{
strDir = szDir;
return IDOK;
}
return IDCANCEL;
}
{
CString sFile;
GetDlgItemText(IDC_EDIT_FILE,sFile);
std:: string strFile = sFile;
if (IDOK == BaseFunc::selFile(strFile, " mp3 ", true))
{
SetDlgItemText(IDC_EDIT_FILE,strFile.c_str());
}
}
void CselDirDlg::OnBnClickedButtonDir()
{
CString sDir;
GetDlgItemText(IDC_EDIT_DIR,sDir); // 可擴展個返回string
std:: string strDir = sDir;
if (IDOK == BaseFunc::selDir(strDir,GetSafeHwnd()))
{
SetDlgItemText(IDC_EDIT_DIR,strDir.c_str());
}
}
url: http://greatverve.cnblogs.com/archive/2012/12/16/SHBrowseForFolder-CFileDialog.html
注意:目錄瀏覽函數不僅可以選擇目錄,也可以用來選擇一個文件。
下例是一個既可以選擇目錄也可以選擇文件的代碼范例。該范例中詳細說明了相關消息的含義及使用方法。
//目錄瀏覽對話框可能會像回調函數發送3種消息:
//BFFM_INITIALIZED --
//
//BFFM_SELCHANGED -- 目錄瀏覽對話框當前選擇項發生變化時調用此消息。
//
//BFFM_VALIDATEFAILED -- 表示用戶按確認按鈕時卻發現瀏覽對話框的編輯框內輸入了一個非法名稱
//
//回調函數可以發送如下幾個消息給目錄瀏覽對話框,從而改變目錄瀏覽對話框的面目
//BFFM_SETSELECTION
//BFFM_ENABLEOK
//BFFM_SETSTATUSTEXT-- 改變目錄瀏覽對話框中狀態行消息,當然前提是目錄瀏覽對話框中有狀態行
int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData)
{
}
void CModifyFileAttributeDlg::OnSelectpath()