最近学习了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