MFC选择目录SHBrowseForFolder选择文件CFileDialog对话框设置默认路径
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()
我这个博客废弃不用了,今天想寻找外链的时候,突然想到这个博客权重很高。
有需要免费外链的,留言即可,我准备把这个博客变成免费的友情链接站点。