问题描述:
实现选择保存路径的按钮功能,选择指定的文件夹并设置到编辑框中
实现代码:
.h文件中
public:
afx_msg void OnBnClickedBtnBrowsePath(); //连接按钮点击事件
BOOL GetCurrDirectory(LPTSTR lpBuffer, DWORD nBufferLength); //声明函数。返回操作系统的当前目录.
.cpp文件中
BOOL C***Dlg::GetCurrDirectory(LPTSTR lpBuffer, DWORD nBufferLength)
//定义函数。返回操作系统的当前目录(指定一个预定义字串用于装载当前目录,缓冲区的长度)
{
if (!lpBuffer || nBufferLength <= 0) return FALSE;
//如果没有文件路径或路径长度小于0,则返回。为检验步骤。
TCHAR szPath[MAX_PATH] = { 0 };
DWORD dwRet = GetModuleFileName(NULL, szPath, MAX_PATH);
/*
需要获得程序当前的运行目录,这时就可以使用GetModuleFileNam
DWORD WINAPI GetModuleFileName (
HMODULE hodule, //要获取文件名的模块句柄, Null表示当前摸块
LPTSTR lpFileName, //参数用于存放地址的指针
DWOED nSize //lpFiieName参数的长度
) ;
返回值
如果返回为成功,将在1pFileNane的缓冲区当中返回相应模块的路径,如果所设的nSize过小,那么返回仅按所设置缓冲区大小返回相应字符串内容。
如果函数失败,返回值将为0,利用GetLastError可获得异常代码。
*/
if (dwRet <= 0) return FALSE;
DWORD dwPathLen = _tcslen(szPath);
//获得当前路径的长度,存储在dwPathLen中。_tcslen是通用版
for (DWORD dwIdx = dwPathLen - 1; dwIdx >= 0; --dwIdx)
//从后向前遍历文件目录字符串,发现第一个\就去掉,换成结束符\0.
{
if (szPath[dwIdx] != '\\') continue;
szPath[dwIdx] = '\0';
break;
}
dwPathLen = _tcslen(szPath);//获取 处理过后的文件夹路径的 长度
DWORD dwCopyLen = (nBufferLength - 1 <= dwPathLen) ? nBufferLength : dwPathLen;
//判断一下nBufferLength(函数输入的缓存长度)与dwPathLen(最新的路径长度)。如果所设的缓存长度小,则用dwPathLen作为缓存长度dwCopyLen【作用:保证字符串长度能够完整存放路径】
_tcsncpy_s(lpBuffer, nBufferLength, szPath, dwCopyLen);
//把dwCopyLen作为结果传输到函数外
return TRUE;
}
void C***Dlg::OnBnClickedBtnBrowsePath() //按钮点击事件
{
// TODO: 在此添加控件通知处理程序代码
TCHAR szCurrPath[MAX_PATH] = { 0 };//设置字符串数组,存储当前文件夹路径
GetCurrDirectory(szCurrPath, MAX_PATH);//调用函数。返回操作系统的当前目录到szCurrPath
CFolderPickerDialog dlg(szCurrPath);
/*CFolderPickerDialog类封装了Windows常用的目录选择对话框,"文件夹拾取对话框"
头文件:afxdlgs.h
构造函数
explicit CFolderPickerDialog (
LPCTSTR lpszFolder =NULL, //初始目录
DWORD dwFlags = 0, //个性化窗具标志位
CVnd* pParent Wnd = NULL, //父窗口句柄
DWORD dwSize = 0 //OPENFILENAE结构的大小
) :
*/
if (dlg.DoModal())
{
CString strFolderPath = dlg.GetPathName();
TCHAR szDstDisk[MAX_PATH] = { 0 };
_stprintf_s(szDstDisk, MAX_PATH, _T("%s\\%s\\"), strFolderPath, _T("xxxx"));//在路径后加上\\xxx\\,创建一个专用保存文件夹
SetDlgItemText(IDC_EDIT_SAVE_PATH, szDstDisk); //设置编辑框内的文字。把处理过的路径,送到编辑框中显示出来(编辑框id,内容)
}
}