1.继续Clean项目
1.1 搜索具有相同后缀名的文件
1.从队列中取得一个将要搜索的路径;
2.在取得的路径下查找文件,若是文件就截取后缀名并和 SetDlg 中的装有后缀名的集合进行匹配,若成功则将这个文件路径插入到 m_lcDeletePath 中;若是文件则将其与当前父路径进行拼接并存到队列中去;
void CCleanDlg::OnBnClickedButton1()
{
// 主对话框中的 搜索 按钮
queue<CString> qu;
// 去下 标签中CShowdlg中的list中的选中文本
for(int i=0; i<m_tab.m_showdlg.m_lcShowPath.GetItemCount(); i++)
{
// 判断是否选中
if(m_tab.m_showdlg.m_lcShowPath.GetCheck(i) == TRUE)
{
// 选中则获取 字符串路径
CString strPath = m_tab.m_showdlg.m_lcShowPath.GetItemText(i, 0);
qu.push(strPath);
}
}
// 取得选中路径之后就需要开始进行搜索相关的文件
while (qu.empty() == false)
{
// 从队列中取下一个路径进行遍历
CString strPath = qu.front();
qu.pop();
// 进行查找当前路径下的文件或文件夹
CFileFind file;
BOOL b_flag = file.FindFile(strPath+"\\"+"*.*");
// 当前路径中有文件时
while(b_flag)
{
b_flag = file.FindNextFile();
// 过滤 . 和 .. 文件夹(一定得过滤掉,不然会导致死循环)
if(file.IsDots() == TRUE)
continue;
// 获取文件名或文件夹名
CString str_file_name = file.GetFileName();
if(file.IsDirectory() == TRUE) // 判断是否是文件夹
{
// 若是文件夹,则拼接路径,并存储到qu中
qu.push(strPath + "\\" + str_file_name);
}
else // 若是文件
{
// 若是文件则截取后缀并和setdlg中的后缀集合进行比较,判断有无此后缀
int index = str_file_name.ReverseFind('.');
if(index != -1)
{
CString str_ex_name = str_file_name.Right(str_file_name.GetLength() - index);
// 截取到后缀之后进行匹配
if(m_tab.m_setdlg.m_stExName.count(str_ex_name))
{
// 进入此判断说明匹配成功
// 匹配成功就将当前文件的路径加入到m_lcDeletePath列表中去
m_lcDeletePath.InsertItem(m_lcDeletePath.GetItemCount(),
strPath+"\\"+str_file_name);
}
}
}
}
}
}
1.2 经过之前的学习,Clean项目基本完成,下面我们可以继续写一点东西将其进行完善,本次为其添加登陆界面
1.首先我们添加一个新的对话框,在对话框中添加两个 Edit Control 和两个 Button 按钮;
2.给这个对话框添加类,继承自 CDialog ,名字为 CLoginDlg ;
3.给两个 Edit Control 控件添加变量,变量用来记录控件上的字符串,故类型为 CString ,名字为 m_user_name 和 m_user_password ;
4.一个按钮为 注册 ,一个按钮为 登陆 ;
5.本次完成 登陆 按钮;给 登陆 按钮添加一个消息处理函数 CLoginDlg::OnBnClickedButton2 ;
6.在函数 CLoginDlg::OnBnClickedButton2 中,首先从对话框上往下取字符串: UpdateData(TRUE) ;再进行判断;
void CLoginDlg::OnBnClickedButton2()
{
// 取得用户名和密码
UpdateData(TRUE);
if(m_user_name == L"123" && m_user_password == L"123")
CDialog::OnOK();
else
{
MessageBox(L"用户名或密码错误!");
}
}
7.我们需要在创建主对话框之前创建登陆对话框,故我们需要在 App 类中先定义一个 CLoginDlg 对象,并在 CCleanApp::InitInstance 函数中将 CLoginDlg 对象以一个模态对话框进行显示,之后再创建主对话框;
BOOL CCleanApp::InitInstance()
{
... ...
// 创建 shell 管理器,以防对话框包含
// 任何 shell 树视图控件或 shell 列表视图控件。
CShellManager *pShellManager = new CShellManager;
// 激活“Windows Native”视觉管理器,以便在 MFC 控件中启用主题
CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
// 标准初始化
// 如果未使用这些功能并希望减小
// 最终可执行文件的大小,则应移除下列
// 不需要的特定初始化例程
// 更改用于存储设置的注册表项
// TODO: 应适当修改该字符串,
// 例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
// ============================首先显示登陆界面=====================================
if(m_login_dlg.DoModal() == IDCANCEL)
{
// 删除上面创建的 shell 管理器。
if (pShellManager != NULL)
{
delete pShellManager;
}
return FALSE;
}
// ============================首先显示登陆界面=====================================
CCleanDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置处理何时用
// “确定”来关闭对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用
// “取消”来关闭对话框的代码
}
else if (nResponse == -1)
{
TRACE(traceAppMsg, 0, "警告: 对话框创建失败,应用程序将意外终止。\n");
TRACE(traceAppMsg, 0, "警告: 如果您在对话框上使用 MFC 控件,则无法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n");
}
// 删除上面创建的 shell 管理器。
if (pShellManager != NULL)
{
delete pShellManager;
}
// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return FALSE;
}