新建对话框功能,创建如图的对话框:
为两个按钮建立消息响应,为两个编辑框和进度条控件绑定控件变量:
CProgressCtrl m_Progress;
CEdit m_Prefix;
CEdit m_FileDir;
消息响应:
void CFileRenameDlg::OnBtBrowse()
{
TCHAR szPath[1000];
CString str;
ZeroMemory(szPath,sizeof(szPath));
BROWSEINFO bi;
bi.hwndOwner=this->GetSafeHwnd();
bi.pidlRoot=NULL;
bi.pszDisplayName=szPath;
bi.lpszTitle="请选择文件夹:";
bi.ulFlags=BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;
bi.lpfn=BrowseCallBackProc;
bi.lParam=(LPARAM)_TEXT("桌面:\\");
bi.iImage=0;
LPITEMIDLIST lp=SHBrowseForFolder(&bi);
if(lp && SHGetPathFromIDList(lp, szPath))
{
str.Format("选择的目录为 %s", szPath);
//AfxMessageBox(str);
}
else
{
AfxMessageBox("无效的目录,请重新选择");
return ;
}
m_FileDir.SetWindowText(szPath);
}
int CALLBACK BrowseCallBackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
switch(uMsg)
{
case BFFM_INITIALIZED: //选择文件夹对话框初始化
//设置默认路径为lpData即'D:\'
::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData);
//在STATUSTEXT区域显示当前路径
::SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, lpData);
//设置选择文件夹对话框的标题
::SetWindowText(hwnd, TEXT("测试"));
break;
case BFFM_SELCHANGED: //选择文件夹变更时
{
TCHAR pszPath[MAX_PATH];
//获取当前选择路径
SHGetPathFromIDList((LPCITEMIDLIST)lParam, pszPath);
//在STATUSTEXT区域显示当前路径
::SendMessage(hwnd, BFFM_SETSTATUSTEXT, TRUE, (LPARAM)pszPath);
}
break;
}
return 0;
}
//开始批量重命名文件
void CFileRenameDlg::OnBtStart()
{
CFileFind flFind;
CString szDir;
m_FileDir.GetWindowText(szDir);
BOOL IsFind2=flFind.FindFile(szDir + "\\*.*");
//统计位图数量
int nBmpCount = 0;
CFileFind flFindCount;
BOOL IsFind=flFindCount.FindFile(szDir + "\\*.*");
while (IsFind)
{
IsFind=flFindCount.FindNextFileA();
if (!flFindCount.IsDirectory())
{
CString szPath;
szPath = flFindCount.GetFilePath();
//MessageBox(szPath);
char szLetter[128] = {0}; //盘符
char szCurDir[128] = {0}; //目录
char szName[128] = {0}; //文件名
char szExt[128] = {0}; //扩展名
_splitpath(szPath.GetBuffer(0), szLetter, szCurDir, szName, szExt); //分解目录
//判断文件扩展名
if (strcmp(szExt, ".bmp") == 0)
{
nBmpCount++;
}
}
}
flFindCount.Close();
m_Progress.SetRange32(0, nBmpCount);
//遍历位图文件
szDir = szDir + "\\bmp";
CreateDirectory(szDir, NULL); //创建目录
int nIndex = 1;
while(IsFind2)
{
IsFind2=flFind.FindNextFileA();
if (!flFind.IsDirectory())
{
CString szPath;
szPath = flFind.GetFilePath();
char szLetter[128] = {0}; //盘符
char szCurDir[128] = {0}; //目录
char szName[128] = {0}; //文件名
char szExt[128] = {0}; //扩展名
_splitpath(szPath.GetBuffer(0), szLetter, szCurDir, szName, szExt); //分解目录
//获取前缀
CString szPrefix;
m_Prefix.GetWindowText(szPrefix);
//判断文件扩展名
if (strcmp(szExt, ".bmp") == 0)
{
CFile file;
CString szCreatedName = szDir;
szCreatedName += "\\";
szCreatedName += szPrefix; //添加前缀
CString szIndex;
szIndex.Format("%d", nIndex);
szCreatedName += szIndex; //添加序号
szCreatedName += ".bmp";
m_Progress.SetPos(nIndex);
nIndex++;
//创建新的文件
file.Open(szCreatedName, CFile::modeCreate|CFile::modeReadWrite);
CFile readFile;
readFile.Open(szPath, CFile::modeRead);
DWORD dwLen = readFile.GetLength();
BYTE *pData = new BYTE[dwLen];
readFile.Read((void*)pData, dwLen);
readFile.Close();
file.Write((void*)pData, dwLen);
file.Close();
delete [] pData;
szCreatedName.ReleaseBuffer();
szIndex.ReleaseBuffer();
}
}
}
flFind.Close();
CString szBmpCount;
szBmpCount.Format("%d个文件!", nBmpCount);
MessageBox("操作完成,处理" + szBmpCount);
szBmpCount.ReleaseBuffer();
}
创建文件夹对话框的代码,请看《文件夹对话框的创建》,关于CFindFile的代码请看《CFindFile类的一个误区》。运行结果:
原本我打开的是新建文件夹,里面只有四张图片,三张是bmp的。代码运行成功后,打开重命名的bmp文件。可以看到重命名的图片。说明一下,对于中文命名的图片,会直接用重命名的前缀代替。英文命名的则不会。