1、选择目录SHBrowseForFolder使用方法介绍,此方法可以设置默认路径
bool SelectFilePath( TString& strFilePath )
{
TCHAR szPathName[MAX_PATH] = {0};
BROWSEINFO bInfo = {0};
TString strDefaultPath = _T("E:\\"); // 注意路径中不要带'\..\'或'\.\'符号,否则设置默认路径失败;
bInfo.hwndOwner = GetForegroundWindow(); // 父窗口;
bInfo.lpszTitle = _T("选择目录");
bInfo.ulFlags = BIF_RETURNONLYFSDIRS | BIF_USENEWUI /*包含一个编辑框 用户可以手动填写路径 对话框可以调整大小之类的..;*/
| BIF_UAHINT /*带TIPS提示*/ /*| BIF_NONEWFOLDERBUTTON 不带新建文件夹按钮*/;
// 关于更多的 ulFlags 参考 http://msdn.microsoft.com/en-us/library/bb773205(v=vs.85).aspx;
bInfo.lpfn = (CDataBackupDlg::BrowseCallbackProc);
bInfo.lParam = (LPARAM)(LPCTSTR)(strDefaultPath.c_str());
LPITEMIDLIST lpDlist;
lpDlist = SHBrowseForFolder(&bInfo);
if ( nullptr == lpDlist ) // 单击了确定按钮;
{
strFilePath.clear();
return false;
}
SHGetPathFromIDList(lpDlist, szPathName);
strFilePath = szPathName;
return true;
}
// 此回调函数为全局函数或静态函数;
int CALLBACK BrowseCallbackProc( HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData )
{
switch(uMsg)
{
case BFFM_INITIALIZED:
{
::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)lpData);
}
break;
default:
break;
}
return 0;
}
详细介绍一下回调函数的相关知识。
//目录浏览对话框可能会像回调函数发送3种消息:
//BFFM_INITIALIZED – 通知对话框已经初始化结束。回调函数响应此消息时通常是做初始选择
//BFFM_SELCHANGED – 目录浏览对话框当前选择项发生变化时调用此消息。回调函数响应此消息时通常是显示所选项的相关信息
//BFFM_VALIDATEFAILED – 表示用户按确认按钮时却发现浏览对话框的编辑框内输入了一个非法名称,/回调函数响应此消息时通常是提示客户选择项非法,并确定是否继续显示该对话框
//回调函数可以发送如下几个消息给目录浏览对话框,从而改变目录浏览对话框的面目
//BFFM_SETSELECTION – 改变当前选择项目
//BFFM_ENABLEOK – 改变“确认”按钮的状态
//BFFM_SETSTATUSTEXT-- 改变目录浏览对话框中状态行消息,当然前提是目录浏览对话框中有状态行
int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData)
{
switch (uMsg)
{
case BFFM_INITIALIZED://BFFM_INITIALIZED表示浏览对话框已经初化结束,参数lParam为NULL
{
//设置初始选项
::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,lpData);
//关于BFFM_SETSELECTION消息的说明
//wParam :标记lParam参数包含一个ITEMIDLIST结构(PIDL)还是一个目录路径名,如果为TRUE,lParam内容为路径名;否则lParam包含一个路径PIDL。
//lParam :内容为浏览对话框所选的路径。如果wParam为TRUE,lParam内容为一个以NULL结尾的字符串的指针,否则为PIDL
break;
}
case BFFM_SELCHANGED: //BFFM_SELCHANGED表示选择项已经发生变化,参数lParam包含列表中最新选中项的条目ID
{
ITEMIDLIST * pidl;
char path[MAX_PATH];
//根据条目ID取路径信息
pidl = (ITEMIDLIST*) lParam;
if (SHGetPathFromIDList(pidl, path))
{
//使得“确认”按钮生效
//关于BFFM_ENABLEOK消息的说明
//wParam :无意义,可设置为0
//lParam :如果为非0,则使能确认按钮;否则失效“确认”按钮
::SendMessage(hwnd,BFFM_ENABLEOK,0,TRUE);
//读属性
DWORD attributes = ::GetFileAttributes(path);
//命令状态行显示当前所选项的全路径名及其文件属性
//关于BFFM_SETSTATUSTEXT消息的说明
//wParam :无意义,可设置为0
//lParam :指向一个内含状态行提示信息的字符串
CString strText;
strText.Format("%s%s%s%s",
path,
attributes & FILE_ATTRIBUTE_HIDDEN ? ",H":"",
attributes & FILE_ATTRIBUTE_READONLY ? ",R":"",
attributes & FILE_ATTRIBUTE_SYSTEM ? ",S":""
);
::SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)(LPTSTR)(LPCTSTR)strText);
}
else
{
//使得“确认”按钮失效
::SendMessage(hwnd,BFFM_ENABLEOK,0,FALSE);
//清状态行信息
::SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)(LPTSTR)(LPCTSTR)"");
}
break;
}
case BFFM_VALIDATEFAILED:
{
//BFFM_VALIDATEFAILED表示用户在浏览对话框的编辑框内输入了一个非法名称,该消息在用户按“确认”时送出——当然前提是编辑框内输入的名称非法,lParam参数包含了非法输入内容的地址,应用程序可以使用这个消息提示用户输入非法。另外,此消息的回调函数返回0表示目录浏览对话框旋即关闭,返回其他值则允许对话框继续显示。仅当目录浏览对话框中含有编辑框并且设置了BIF_VALIDATE标记才可能出现此消息,即BROWSEINFO结构中ulFlags含有BIF_EDITBOX|BIF_VALIDATE标志
CString strTip;
strTip.Format("目录%s非法!",lParam);
//返回0允许对话框提前关闭,SHBrowseForFolder()返回NULL
AfxMessageBox(strTip);
return 0;
//返回1对话框继续显示,因为对话框仍继续显示,可以在状态行显示出错消息
//注意:如果此时仍用AfxMessageBox来显示提示信息,提示信息框关闭后,要使焦点重返目录
//浏览对话框,需要客户手工移动鼠标激活该对话框才行,这样会使得后继操作不是很方便,所以在状态行显示提示信息比较好
//::SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)(LPTSTR)(LPCTSTR)strTip);
//return 1;
break;
}
default:
{
ASSERT(FALSE);
}
}
return 0;
}
2、CFileDialog获取文件路径的使用。
explicit CFileDialog(
BOOL bOpenFileDialog,//指定要创建的文件对话框的类型。设为TRUE将创建打开文件对话框,否则将创建保存文件对话框。
LPCTSTR lpszDefExt = NULL,//默认的文件扩展名。如果用户在文件名编辑框中没有输入扩展名,则由lpszDefExt指定的扩展名将被自动添加到文件名后。
LPCTSTR lpszFileName = NULL,//文件名编辑框中显示的初始文件名。如果为NULL,则不显示初始文件名。
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,//文件对话框的属性,可以是一个值也可以是多个值的组合。
LPCTSTR lpszFilter = NULL,//文件过滤器,它是由若干字符串对组成的一个字符串序列
CWnd* pParentWnd = NULL,//文件对话框的父窗口的指针。
DWORD dwSize = 0,//OPENFILENAME结构体的大小
BOOL bVistaStyle = TRUE//指定文件对话框的风格,设为TRUE则使用Vista风格的文件对话框,否则使用旧版本的文件对话框。
);
实例:
CString szFilter = _T("图片文件(*.bmp)|*.bmp|图片文件(*.jpg)|*.jpg|所有文件(*.*)|*.*|");
CFileDialog FileDlg(FALSE, _T("File"), _T(""), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
if ( IDOK != FileDlg.DoModal() ) return ;
CString FilePath= FileDlg.GetPathName();
3、指定文件后缀名的获取。
//获取指定后缀文件路径
void CProjectManagerTool::FindDataPath(CString path, CString Mark,vector<CString> &fileList,vector<CString> &CaseNameList )
{//path:文件夹路径;Mark:指定的文件后缀;fileList:找到的文件路径集合;CaseNameList :找到的文件名集合
CString myDataPath,fdPath;
myDataPath=path + _T("\\*.*");
CString strTmp;
CFileFind find;
BOOL bf = find.FindFile(myDataPath);
while(bf)
{
bf = find.FindNextFile();
if(!find.IsDots())
{
fdPath=find.GetFilePath();
if (find.IsDirectory())
{
//如果是文件夹,递归,继续往下找
FindDataPath(fdPath,Mark, fileList,CaseNameList);
}
else
{
//如果是文件,判断是否是*.txt
strTmp=fdPath.Right(Mark.GetLength());
strTmp.MakeLower();
if ( strTmp==Mark)
{
fileList.push_back(fdPath);
int nPos = fdPath.ReverseFind('\\');
CString str = fdPath.Left(nPos);
nPos = str.ReverseFind('\\');
CaseNameList.push_back(str.Right(str.GetLength()-nPos-1));
}
}
}
}
find.Close();
}