MFC 用户登录、注册、工作主窗体
创建项目由向导生成的窗体作为工作的主窗体。用户登录、注册窗体添加对话框来实现。
【具体功能】
1、主窗体应该出现在登录窗体成功之后。
2、登录窗体关闭(右上角❌),程序直接退出。
在App.cpp的InitInstance()内起始处加入代码
//============登录===========//在主程序窗口运行前首先弹出登录对话框 while (TRUE) { CLogin login_Dialog; //模态对话框 int nReturn = login_Dialog.DoModal();//返回IDOK或IDCANCEL。如果返回的是IDCANCEL,则要调用WindowsCommDlgExtendedError函数来确定是否发生了一个错误。IDOK和IDCANCEL都是常量,它表明用户选择的是OK按钮还是Cancel按钮 if (nReturn == IDCANCEL)//点击取消 { return FALSE; } if (nReturn == IDOK)//点击确定 { //HWND login_Hwnd = GetDlgItem(login_Dialog, IDD_DIALOG1); CString str_User = login_Dialog.m_strUser; CString str_Password = login_Dialog.m_strPassword; if (!(str_User == "admin" && str_Password == "admin"))//如果用户名密码不是admin/admin,则报错,提示重新输入,直至正确为止。 { if (IDOK == MessageBox(NULL, TEXT("用户ID或密码错误!\n 请重新输入!"),TEXT( "登录失败!"), MB_OKCANCEL | MB_ICONERROR)) continue; else return FALSE; } else break; } }
用户登录对话框
void CMFCApplication17Dlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE);//将控件数据复制给控件变量 CString username; CString password; //与注册类似操作 bool flag = false; //char * path = "username.txt"; CString path = TEXT("./username.txt"); CFile file; file.Open(path, CFile::modeCreate | CFile::modeRead); file.SeekToBegin(); CArchive ar(&file, CArchive::load); //去除数据左右空格数据 m_loginName.Trim(); m_loginPwd.Trim(); //校验用户密码,与注册校验相同的操作,这里多验证了一步,即校验密码 while (ar.ReadString(username)) { if (ar.ReadString(password)) { username.Trim(); password.Trim(); if (username == m_loginName && password == m_loginPwd) { flag = true; break; } } } //关闭CFile和CArchive ar.Close(); file.Close(); if (flag) { //m_Login_Result = m_Login_Account + " " + " " + "已登录";//找到则显示的是用户名+性别+已登录 m_loginName = "";//成功登录后把用户框和密码框文本清除 m_loginPwd = ""; UpdateData(FALSE);//将数据从控件变量传递给控件 CWork dlgW; dlgW.DoModal(); } else{ MessageBox(TEXT("用户名不存在或密码错误"));//用户密码错误或用户不存在提示 } }
void CMFCApplication17Dlg::OnBnClickedButton2() { // TODO: 在此添加控件通知处理程序代码 CRegister reg; reg.DoModal(); }
用户注册对话框
void CRegister::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 CString username;//从文件中读取用户名进行校验,如果输入的用户名在文件已存在则不进行注册 bool flag = false;//标记 //char * path = "username.txt";//文件路径 CString path = TEXT("username.txt"); CFile fp;//使用MFC的CFile将暑假写入文件 fp.Open(path, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite); fp.SeekToBegin();//移动文件指针位置至文件头 CArchive ar(&fp, CArchive::load);//使用CArchive进行读取文件 UpdateData(TRUE);//将数据从控件复制到控件变量 //进行左右空格清除 m_registerName.Trim(); m_registerPwd1.Trim(); m_registerPwd2.Trim(); //校验操作 while (ar.ReadString(username)) { username.Trim(); if (username == m_registerName) { flag = true;//如果已存在用户名,则标记flag为true break; } else { ar.ReadString(username);//读取下一行(每一行为一个属性,比如用户名,密码) ar.ReadString(username);//读取下一行 } } ar.Close(); fp.SeekToEnd();//文件写入为追加操作,所以写入前必须将文件指针移动至文件尾 if (!flag) { //CFile Write(*str,GetLength())写入 fp.Write(m_registerName, m_registerName.GetLength()); //win虽是\r\n,在写程序只需要\n即可换行 fp.Write("\r\n", sizeof(char)); if (m_registerPwd1 != m_registerPwd2) { MessageBox(TEXT("密码不一致")); } else { fp.Write(m_registerPwd1, m_registerPwd1.GetLength()); fp.Write("\r\n", sizeof(char)); fp.Close(); MessageBox(TEXT("注册成功")); CDialog::OnOK(); } } else { MessageBox(TEXT("用户已存在"));//用户已存在提示框,不关闭注册框,可让用户自由选择是否继续注册 } }