創建項目由向導生成的窗體作為工作的主窗體。用戶登錄、注冊窗體添加對話框來實現。
【具體功能】
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("用戶已存在"));//用戶已存在提示框,不關閉注冊框,可讓用戶自由選擇是否繼續注冊 } }