第二次作业(基于 visual studio 2022 环境下的“MFC”计算器登录使用)

发布时间 2023-12-03 23:05:56作者: 武云舟

一、前言

1、系统环境:Window10,visual studio 2022,MYSQL Client(MariaDB 5.5(X64))。

2、界面:这是一个MFC界面,通过连接创建的数据库,实现计算器登录、运算以及查看历史记录的功能。

二、设计过程

1、流程图:

2、数据库表格创建与连接

(1)创建用户表“yunzhou”:

(2)创建历史记录表“yunzhou1”:

(3)连接mysql数据库:

①把配置属性的“环境”填写为系统安装mysql的路径下的bin文件夹,即“PATH=D:\mysql\mysql-8.0.23-winx64\bin;”。

②在安装mysql的文件夹中,找到“lib”文件夹下的“libmysql.lib”和“libmysql.dll”,复制这两个文件到创建MFC程序的同级目录下。

③修改“VC++目录”中的 包含目录、引用目录、库目录,其路径分别是你系统里安装mysql路径的include、lib、lib文件夹。
再修改“C/C++”的常规,和 “链接器”的常规和输入,见图。

 3、计算器界面设计:

(1):通过 visual studio 2022 下的MFC进行视图设计如下;

(2):对各个编辑框进行属性定义,实现相关功能。

注:进行属性定义,功能实现时,由于MFC框架下的C++语言自定义代码由系统生成,现展示关键代码如下.

①:登录功能

void CwuzhoujsqDlg::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码
    // Login Button
    //CDialogEx::OnOK();

        GetDlgItem(IDC_EDIT1)->GetWindowText(username); //获得输入的用户名
        GetDlgItem(IDC_EDIT2)->GetWindowText(password); //获得输入的密码

        const char user[] = "root"; //填写你的 mysql 用户名
        const char pswd[] = "123456";  //填写你的 mysql 密码
        const char host[] = "localhost";
        const char database[] = "test";  //填写你的 mysql 数据库名称
        unsigned int port = 3306;

        MYSQL_RES* res;
        MYSQL_ROW row;
        MYSQL mysqlCon;
        if (username.IsEmpty() || password.IsEmpty())
        {
            MessageBox(_T("用户名或密码不能为空!"), _T("用户登录信息"));
            return;
        }
        mysql_init(& mysqlCon);
        if (!mysql_real_connect(& mysqlCon, host, user, pswd, database, port, NULL, 0))
        {
            AfxMessageBox(_T("访问数据库失败!"));
        }
        else
        {
            mysql_query(& mysqlCon, "SET USER GBK"); //设置字符集
            AfxMessageBox(_T("访问数据库成功!"));
        }
        int ress = mysql_query(& mysqlCon, "select*from yunzhou");
        if (ress == 0) //检测查询成功为0,不成功则非0
        {
            res = mysql_store_result(& mysqlCon); //保存查询到的数据到 res
            if (mysql_num_rows(res) == 0) //查询结果为空
            {
                AfxMessageBox(_T("用户不存在"));
            }
            else
            {
                row = mysql_fetch_row(res);
                if (password == row[1])
                {
                    mysql_free_result(res);
                    MessageBox(_T("已上线!"),L"提示",MB_OK);
                }
                else
                {
                    AfxMessageBox(_T("密码错误!"));
                }
            }
        }
        else
        {
            AfxMessageBox(_T("访问失败!"));
        }
        mysql_close(& mysqlCon);
}

计算器登录过程如下:

②计算功能:

void CwuzhoujsqDlg::Calculator()
{
    UpdateData(TRUE);
    mNum2 = _wtof(mStr);
    double result = 0.0f;
    switch (mFlag)
    {
    case FLAG_JIA:
        result = mNum1 + mNum2;
        mTempStr = mTempStr + _T("+") + mStr + _T("=");
        break;
    case FLAG_JIAN:
        result = mNum1 - mNum2;
        mTempStr = mTempStr + _T("-") + mStr + _T("=");
        break;
    case FLAG_CHENG:
        result = mNum1 * mNum2;
        mTempStr = mTempStr + _T("*") + mStr + _T("=");
        break;
    case FLAG_CHU:
        if (mNum2 == 0) {
            mTempStr = _T("出0错误");
        }
        else
        {
            result = mNum1 / mNum2;
            mTempStr = mTempStr + _T("/") + mStr + _T("=");
        }
        break;
    default:
        break;
    }
    if (result - (int)result <= 1e-5) {
        mStr.Format(L"%d", (int)result);
    }
    else {
        mStr.Format(L"%f", result);
    }
    mTempStr += mStr;//计算记录在mTempStr中
    //SaveMySql(mTempStr);
    //UpdateData(FALSE);
    mNum1 = 0.0f;
    mNum2 = 0.0f;
    SaveMySql(mTempStr);
}

计算过程如下:

③历史记录插入:

void CwuzhoujsqDlg::SaveMySql(CString text)
{
    const char user[] = "root"; //填写你的 mysql 用户名
    const char pswd[] = "123456";  //填写你的 mysql 密码
    const char host[] = "localhost";
    const char database[] = "test";  //填写你的 mysql 数据库名称
    unsigned int port = 3306;
    MYSQL_RES* res;
    MYSQL_ROW row;
    MYSQL mysqlCon;
    mysql_init(&mysqlCon);
    if (!mysql_real_connect(&mysqlCon, host, user, pswd, database, port, NULL, 0))
    {
        AfxMessageBox(_T("访问数据库失败!"));
    }
    else
    {
        mysql_query(&mysqlCon, "SET NAMES GBK"); //设置字符集,确保能够插入中文数据
        CStringW sql;
        sql.Format(_T("INSERT INTO yunzhou1 (test) VALUES ('%s')"), text);
        AfxMessageBox(sql);
        LPCWSTR sqlW = sql.GetString();
        int size_needed = WideCharToMultiByte(CP_UTF8, 0, sqlW, -1, NULL, 0, NULL, NULL);  // 计算所需的缓冲区大小
        char* sql_char = new char[size_needed];
        WideCharToMultiByte(CP_UTF8, 0, sqlW, -1, sql_char, size_needed, NULL, NULL);  // 将宽字符转换为多字节字符
        CString str(sql_char);
        MessageBox(str);
        if (mysql_query(&mysqlCon, sql_char) == 0)
        {
            AfxMessageBox(_T("插入成功!"));
        }
        else
        {
            AfxMessageBox(_T("插入失败!"));
        }
    }
    mysql_close(&mysqlCon);
}

插入过程如下:

mysql数据库中历史记录保存查询如下: