• 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("用户已存在"));//用户已存在提示框,不关闭注册框,可让用户自由选择是否继续注册
        }
    }
  • 相关阅读:
    js 练习,点击计算三个数的最大值,省级联动
    CSS 笔记
    CSS练习
    Html 学习笔记
    MySQL 执行计划详解
    别人家的元数据系统是怎么设计的
    深入浅出Dubbo RPC
    算法的时间复杂度和空间复杂度详解
    序列化 & 反序列化
    MySQL的四种隔离级别
  • 原文地址:https://www.cnblogs.com/xixixing/p/11919018.html
Copyright © 2020-2023  润新知