MFC-对话框组合应用-QQ

最近学习了mfc中基于对话框的应用程序开发。

总共实现了以下功能:

1、登录与登录账户管理;

2、账户登录权限管理;

3、录入对话框与员工信息管理;

具体功能有以下部分:

1、登录

2、注册

3、主对话框

4、账户信息管理

5、修改用户信息

6、员工信息管理

7、修改员工信息

8、删除员工信息

9、添加员工信息

10、打开文件

11、保存员工信息到文件

部门实现代码:

登录代码

void CLoginDlg::CreateUser(void)//文件不存在时创建一个管理员账号
{
	CFile file;
	if(!file.Open("./user.txt",CFile::modeCreate|CFile::modeWrite))
	{
		AfxMessageBox("用户文件创建时失败!");
		return;
	}
	SUser u = {"admin","admin","特级"};
	file.Write(&u,sizeof(u));
	file.Close();
}

bool CLoginDlg::CheckUser()//判断用户是否存在
{
	CString szName, szPass;
	GetDlgItemText(IDC_USERNAME, szName);
	GetDlgItemText(IDC_PASS, szPass);
	CFile file;
	SUser user;
	if(!file.Open(_T("./user.txt"), CFile::modeRead | CFile::shareDenyNone))//读取失败,文件不存在
	{
		CreateUser();//创建文件并创建一个管理员账号。
		if(!file.Open(_T("./user.txt"), CFile::modeRead | CFile::shareDenyNone))
			return false;
	}
	while(file.Read(&user, sizeof(user)))
	{
		if(szName == user.szName && szPass == user.szPass)//cstring 可以char[20]直接比较值
		{
			theApp.m_user = user;
			file.Close();
			return true;
		}
	}
	file.Close();
	return false;
}

void CLoginDlg::OnBnClickedOk()
{
	if( CheckUser())//判断用户信息
	{
		OnOK();
	}
	else
	{
		AfxMessageBox(_T("用户名或密码错误"),MB_ICONEXCLAMATION);
		SetDlgItemText(IDC_USERNAME,_T(""));
		SetDlgItemText(IDC_PASS,_T(""));
		GetDlgItem(IDC_USERNAME) ->SetFocus();
	}
}

注册代码:

void CLoginDlg::OnBnClickedRegistry()//注册用户
{
	ShowWindow(SW_HIDE);//隐藏登录窗口
	CRegistry lDlg;
	if(lDlg.DoModal() == IDCANCEL)//显示注册窗口
	{
		OnCancel();
	}
	else
	{
		ShowWindow(SW_SHOW);//重新显示登录窗口
	}

}

重新登录代码:

void CQQDlg::OnBnClickedRelogin()
{
	ShowWindow(SW_HIDE);//隐藏主对话框
	CLoginDlg lDlg;
	if(lDlg.DoModal() == IDCANCEL)//显示登录对话框
	{
		OnCancel();
	}
	else
	{
		CString szPrior = theApp.m_user.szPrior;
		bool bEnable = !( szPrior == _T("普通"));
		GetDlgItem(IDC_ACCOUNT) ->EnableWindow(bEnable);
		ShowWindow(SW_SHOW);
	}
}

权限管理:

void CQQDlg::OnBnClickedAccount()
{
	ShowWindow(SW_HIDE);
	CPriorDlg dlg;
	dlg.DoModal();
	ShowWindow(SW_SHOW);
}

void CPriorDlg::ReadUser(CListCtrl* pList)//读取所有用户信息
{
	pList ->DeleteAllItems();//删除之前的所有数据
	CFile file;
	if(!file.Open(_T("./user.txt"),CFile::modeRead))
		return;
	int i = 0;
	SUser u;
	while(file.Read(&u,sizeof(u)) == sizeof(u)) //读取一个结构体
	{
		pList ->InsertItem(i,u.szName);
		pList ->SetItemText(i,1,u.szPass);
		pList ->SetItemText(i,2,u.szPrior);
		++i;
	}
	file.Close();
}

BOOL CPriorDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// TODO:  在此添加额外的初始化
	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_LIST);
	DWORD dwStyle = pList->GetExtendedStyle();
	dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用于报表风格的listctrl)
	dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与报表风格的listctrl)
	pList->SetExtendedStyle(dwStyle); //设置扩展风格
	CRect rect;
	GetClientRect(&rect);
	int width = (int)(rect.Width())/3.0;
	pList ->InsertColumn(0,_T("账户"),LVCFMT_CENTER,width);//插入列
	pList ->InsertColumn(1,_T("密码"),LVCFMT_CENTER,width);
	pList ->InsertColumn(2,_T("权限"),LVCFMT_CENTER,width);

	ReadUser(pList);
	
	CComboBox* pComb = (CComboBox*)GetDlgItem(IDC_PRIOR);//设置下拉选项
	pComb ->ResetContent();
	pComb ->AddString(_T("普通"));
	pComb ->AddString(_T("高级"));
	pComb ->AddString(_T("特级"));

	pComb ->SetCurSel(0);//默认选择第一个
	

	return TRUE;  // return TRUE unless you set the focus to a control
	// 异常: OCX 属性页应返回 FALSE
}

增加、删除用户

void CPriorDlg::OnBnClickedAdd()//添加一个用户
{
	CString szName;
	CString szPrior;
	CString szPass;
	GetDlgItemText(IDC_NAME,szName);
	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_LIST);
	CComboBox* pComb = (CComboBox*)GetDlgItem(IDC_PRIOR);

	GetDlgItemText(IDC_PASS,szPass);
	if(szPass.GetLength() < 5)
	{
		AfxMessageBox(_T("密码长度小于5!"));
		return ;
	}

	int nCount = pList ->GetItemCount();
	for(int i = 0; i < nCount; i++)
	{
		if(pList ->GetItemText(i, 0) == szName)
		{
			AfxMessageBox(_T("用户已经存在!"));
			SetDlgItemText(IDC_NAME, _T(""));
			SetDlgItemText(IDC_PASS, _T(""));
			pComb ->SetCurSel(0);
			return;
		}
	}
	
	switch(pComb ->GetCurSel())
	{
	case 0:
		szPrior = _T("普通");
		break;
	case 1:
		szPrior = _T("高级");
		break;
	case 2:
		szPrior = _T("特级");
		break;
	};
	pList ->InsertItem(nCount, szName);
	pList ->SetItemText(nCount, 1, szPass);
	pList ->SetItemText(nCount, 2, szPrior);
	SetDlgItemText(IDC_NAME, _T(""));
	SetDlgItemText(IDC_PASS, _T(""));
	pComb ->SetCurSel(0);

}

void CPriorDlg::OnBnClickedDel()//删除一个用户
{
	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_LIST);
	POSITION pos = pList->GetFirstSelectedItemPosition();//适合多选,以蓝色区域为标志是否被选中
	if( pos == NULL)
	{
		AfxMessageBox(_T("请选中一个用户后再操作!"));
		return;
	}
	else
	{
		//int nSel = pList ->GetSelectionMark();//在list上选中了第几行
		int nRes = AfxMessageBox(_T("是否确定删除?"),MB_OKCANCEL|MB_ICONQUESTION);
		if(nRes != 1)
			return;
		while(pos)
		{
			int nSel = pList ->GetNextSelectedItem(pos);//得到当前pos的index,并走到下一个选中的地址

			if(pList->GetItemText(nSel,0) == _T("admin"))
			{
				AfxMessageBox(_T("无法删除admin账号"));
				continue;
			}
			pList->DeleteItem(nSel);
			pos = pList->GetFirstSelectedItemPosition();//由于删除后,下面的行会上移,导致index发生改变。
		}
		
	}
}

修改用户:

void CPriorDlg::OnBnClickedMod()//修改一个用户
{
	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_LIST);
	int nCount = pList ->GetSelectedCount();
	if(nCount == 0)
	{
		AfxMessageBox(_T("请选中一个用户后再操作!"));
		return ;
	}
	else if(nCount > 1)
	{
		AfxMessageBox(_T("一次只能修改一个用户信息!"));
		return ;
	}
	else
	{
		CModifyUser mDlg;
		mDlg.SetPriorDlg(this);//将CPriorDlg的地址赋值给CModifyUser 中一个成员变量
		mDlg.DoModal();
	}

}

BOOL CModifyUser::OnInitDialog()
{
	CDialog::OnInitDialog();

	CListCtrl* pList = (CListCtrl*)m_pDlg->GetDlgItem(IDC_LIST);//读取出CPriorDlg中clistctrl的值
	POSITION pos = pList->GetFirstSelectedItemPosition();
	int nSel = pList ->GetNextSelectedItem(pos);
	CString szName = pList ->GetItemText(nSel,0);
	SetDlgItemText(IDC_NAME, szName);
	GetDlgItem(IDC_NAME)->EnableWindow(false);

	CComboBox* pComb = (CComboBox*)GetDlgItem(IDC_PRIOR);
	pComb ->ResetContent();
	pComb ->AddString(_T("普通"));
	pComb ->AddString(_T("高级"));
	pComb ->AddString(_T("特级"));

	pComb ->SetCurSel(0);

	return TRUE;  // return TRUE unless you set the focus to a control
	// 异常: OCX 属性页应返回 FALSE
}

void CModifyUser::SetPriorDlg(CPriorDlg* p)
{
	m_pDlg = p;
}

void CModifyUser::OnBnClickedOk()
{
	CString szPrior;
	CString szPass;
	GetDlgItemText(IDC_PASS,szPass);

	if(szPass.GetLength() < 5)
	{
		AfxMessageBox(_T("密码长度小于5!"));
		return ;
	}
	CComboBox* pComb = (CComboBox*)GetDlgItem(IDC_PRIOR);//得到新的权限
	CListCtrl* pList = (CListCtrl*)m_pDlg->GetDlgItem(IDC_LIST);
	switch(pComb ->GetCurSel())
	{
	case 0:
		szPrior = _T("普通");
		break;
	case 1:
		szPrior = _T("高级");
		break;
	case 2:
		szPrior = _T("特级");
		break;
	};
	POSITION pos = pList->GetFirstSelectedItemPosition();
	int nSel = pList ->GetNextSelectedItem(pos);
	pList->SetItemText(nSel,1,szPass);
	pList->SetItemText(nSel,2,szPrior);
	OnOK();
}

保存clistctrrl中的用户信息到文件中:

void CPriorDlg::OnDestroy()//退出当前窗口时保存用户信息到文件中
{
	CDialog::OnDestroy();
	CFile file;
	if(!file.Open(_T("./user.txt"),CFile::modeCreate|CFile::modeWrite))
	{
		AfxMessageBox(_T("保存文件失败!"));
	}
	else
	{
		SUser user;
		CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_LIST);
		int nCount = pList ->GetItemCount();
		for(int i = 0; i < nCount; i++)
		{
			pList ->GetItemText(i,0, user.szName, sizeof(user.szName));
			pList ->GetItemText(i,1, user.szPass, sizeof(user.szPass));
			pList ->GetItemText(i,2, user.szPrior, sizeof(user.szPrior));
			file.Write(&user, sizeof(user));
		}
	}
	file.Close();

}

员工信息的打开与保存

void CUserInfoDlg::OnBnClickedOpen()
{
	bool isOpen = true;//true为打开
	CString defaultDir = _T("F:\\vs_project\\mfc\\QQ\\QQ");//默认保存路径
	CString fileName = _T("");//默认文件名称
	CString filterType = _T("文本(*.txt) | *.txt| 文件(*.doc; *.ppt; *.xls) | *.doc;*.ppt;*.xls||");
	CFileDialog dlg(isOpen, NULL, defaultDir + _T("\\") +fileName, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT , filterType, NULL);
	if(IDCANCEL == dlg.DoModal())
		return ;
	CFile file;
	CString szPath = dlg.GetPathName();
	if(!file.Open(szPath,CFile::modeRead| CFile::shareDenyNone))
	{
		AfxMessageBox(_T("打开文件失败!"));
		return;
	}
	m_list.DeleteAllItems();//删除之前的所有数据
	int i = 0;
	SInfo info;
	while(file.Read(&info,sizeof(info)) == sizeof(info)) //读取一个结构体
	{
		m_list.InsertItem(i,info.szNum);
		m_list.SetItemText(i,1,info.szName);
		m_list.SetItemText(i,2,info.szBirth);
		m_list.SetItemText(i,3,info.szSal);
		m_list.SetItemText(i,4,info.szDep);
		++i;
	}
	file.Close();
}

void CUserInfoDlg::OnBnClickedSave()
{
	bool isOpen = false;//false为保存
	CString szDefExt = _T("txt");//缺省时默认扩展名
	CString defaultDir = _T("F:\\vs_project\\mfc\\QQ\\QQ");//默认保存路径
	CString fileName = _T("userinfo");//默认文件名称
	CString filterType = _T("文本(*.txt) | *.txt| 文件(*.doc; *.ppt; *.xls) | *.doc;*.ppt;*.xls||");//只显示某种类型
	CFileDialog dlg(isOpen, szDefExt, defaultDir + _T("\\") +fileName, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT , filterType, NULL);
	if(IDCANCEL == dlg.DoModal())
		return ;
	CString szPath = dlg.GetPathName();
	CFile file;
	if(!file.Open(szPath,CFile::modeCreate|CFile::modeWrite))
	{
		AfxMessageBox(_T("保存文件失败!"));
		return ;
	}
	SInfo info;
	memset(&info,0,sizeof(info));
	int nCount = m_list.GetItemCount();
	for(int i = 0;i < nCount; i++)
	{
		m_list.GetItemText(i, 0 ,info.szNum, sizeof(info.szNum));
		m_list.GetItemText(i, 1 ,info.szName, sizeof(info.szName));
		m_list.GetItemText(i, 2 ,info.szBirth, sizeof(info.szBirth));
		m_list.GetItemText(i, 3 ,info.szSal, sizeof(info.szSal));
		m_list.GetItemText(i, 4 ,info.szDep, sizeof(info.szDep));
		file.Write(&info,sizeof(info));
	}
}

详细代码:https://download.csdn.net/download/huanhuanxiaoxiao/10559762

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值