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或密码错误!
 请重新输入!"),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虽是
,在写程序只需要
即可换行
        fp.Write("
", sizeof(char));
        if (m_registerPwd1 != m_registerPwd2)
        {
            MessageBox(TEXT("密码不一致"));
        }
        else
        {
            fp.Write(m_registerPwd1, m_registerPwd1.GetLength());
            fp.Write("
", sizeof(char));
            fp.Close();
            MessageBox(TEXT("注册成功"));
            CDialog::OnOK();
        }
    }
    else
    {
        MessageBox(TEXT("用户已存在"));//用户已存在提示框,不关闭注册框,可让用户自由选择是否继续注册
    }
}
原文地址:https://www.cnblogs.com/xixixing/p/11919018.html