C++学习 2019-1-25

本文档介绍如何在已完成的Clean项目中添加登陆界面。步骤包括创建新的对话框,添加Edit Control和Button,定义CLoginDlg类,设置CString变量,实现登陆按钮的消息处理函数,以及在主对话框前展示登陆对话框。

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;
}
VC做的聊天小程序 // Chat.cpp : 定义应用程序的类行为。 // #include "stdafx.h" #include "Chat.h" #include "ChatDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CChatApp BEGIN_MESSAGE_MAP(CChatApp, CWinApp) ON_COMMAND(ID_HELP, &CWinApp::OnHelp) END_MESSAGE_MAP() // CChatApp 构造 CChatApp::CChatApp() { // 支持重新启动管理器 m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART; // TODO: 在此处添加构造代码, // 将所有重要的初始化放置在 InitInstance 中 } // 唯一的一个 CChatApp 对象 CChatApp theApp; // CChatApp 初始化 BOOL CChatApp::InitInstance() { // 如果一个运行在 Windows XP 上的应用程序清单指定要 // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式, //则需要 InitCommonControlsEx()。否则,将无法创建窗口。 INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(InitCtrls); // 将它设置为包括所有要在应用程序中使用的 // 公共控件类。 InitCtrls.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&InitCtrls); CWinApp::InitInstance(); if(!AfxSocketInit()) { AfxMessageBox(_T("加载套接字库失败!")); return FALSE; } AfxEnableControlContainer(); // 创建 shell 管理器,以防对话框包含 // 任何 shell 树视图控件或 shell 列表视图控件。 CShellManager *pShellManager = new CShellManager; // 标准初始化 // 如果未使用这些功能并希望减小 // 最终可执行文件的大小,则应移除下列 // 不需要的特定初始化例程 // 更改用于存储设置的注册表项 // TODO: 应适当修改该字符串, // 例如修改为公司或组织名 SetRegistryKey(_T("应用程序向导生成的本地应用程序")); CChatDlg dlg; m_pMainWnd = &dlg; INT_PTR nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: 在此放置处理何时用 // “确定”来关闭对话框的代码 } else if (nResponse == IDCANCEL) { // TODO: 在此放置处理何时用 // “取消”来关闭对话框的代码 } // 删除上面创建的 shell 管理器。 if (pShellManager != NULL) { delete pShellManager; } // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序, // 而不是启动应用程序的消息泵。 return FALSE; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值