0


MFC基于对话框——仿照Windows计算器制作C++简易计算器

制作好之后是这样的,可以实现加减乘除,连加连减,连乘连除,除数为0会提示,正负号的运算也可以,可以清除所有数据,也可以在输入数据时退格,下方是版权信息

一、界面设计

如下图所示,19个Button按钮,3个静态文本框

给每个控件做对齐排布,右上角有对齐的工具,并且改上对应的Caption,上方的静态文本框的ID改为IDC_STATICSHOW;下方的文本框ID改为IDC_STATICRESULT,属性里面是不可以直接改字体样式(大小和字体),只能在OnInitDialog写入初始化代码修改,每个button也可以根据自己的命名规则来改(比如我不会的单词,除法,乘法啥的用拼音代替,IDC_CHUFA)

二、设置成员变量

在CALDlg.h(自己的项目名Dlg.h头文件中),添加公有变量和私有变量

公有变量:

public://自己添加的共有的成员变量
    CString m_strResult;//运算结果的成员变量
    CString m_strShow;//展示
    CString m_strTemp;//临时存储的字符串
    char m_symbol;//符号
    double m_num;//数字
    double m_result;//结果
    afx_msg void OnBnClickedOk();//以确定方式退出

私有变量:

private:
    //添加两个可以控制字体的类变量
    CFont m_font;
    CStatic m_static;

三、初始化成员变量

在CALDlg.cpp中的

初始化代码:

    //初始化成员变量
    m_num = 0;
    m_result = 0;
    m_symbol = 0;

四、初始化对话框

在CALDlg.cpp中找到OnInitDialog,在return TRUE之前添加如下代码

    // TODO: 在此添加额外的初始化代码
    //给计算结果的静态文本框初始化显示为0
    SetDlgItemText(IDC_STATICRESULT, L"0");

    //调整IDC_STATICRESULT的字体
    m_static.SubclassDlgItem(IDC_STATICRESULT, this);
    //m_static.SubclassDlgItem(IDC_STATICSHOW, this);
    m_font.CreatePointFont(200, _T("黑体"));
    m_static.SetFont(&m_font);

初始化字体和初始化文本框的显示结果的:

IDC_STATIC是第二个关于计算的文本框的ID

五、添加控件代码

双击各个控件即可进入对应的事件函数

1.各个数字的代码(0~9)

void CCALDlg::OnBnClickedNum1()//数字1的事件函数
{
    // TODO: 在此添加控件通知处理程序代码
    m_strResult += L"1";//1是宽字符
    SetDlgItemText(IDC_STATICRESULT, m_strResult);//IDC_STATICRESULT是显示运算结果的的静态文本框的ID
    //此处ID报红是正常现象
}

void CCALDlg::OnBnClickedNum2()//数字2的事件函数
{
    // TODO: 在此添加控件通知处理程序代码
    m_strResult += L"2";//2是宽字符
    SetDlgItemText(IDC_STATICRESULT, m_strResult);//IDC_STATICRESULT是显示运算结果的的静态文本框的ID
}

void CCALDlg::OnBnClickedNum3()//数字3
{
    // TODO: 在此添加控件通知处理程序代码
    m_strResult += L"3";//3是宽字符
    SetDlgItemText(IDC_STATICRESULT, m_strResult);//IDC_STATICRESULT是显示运算结果的的静态文本框的ID
}

void CCALDlg::OnBnClickedNum4()//数字4
{
    // TODO: 在此添加控件通知处理程序代码
    m_strResult += L"4";//4是宽字符
    SetDlgItemText(IDC_STATICRESULT, m_strResult);//IDC_STATICRESULT是显示运算结果的的静态文本框的ID
}

void CCALDlg::OnBnClickedNum5()//数字5
{
    // TODO: 在此添加控件通知处理程序代码
    m_strResult += L"5";//5是宽字符
    SetDlgItemText(IDC_STATICRESULT, m_strResult);//IDC_STATICRESULT是显示运算结果的的静态文本框的ID
}

void CCALDlg::OnBnClickedNum6()
{
    // TODO: 在此添加控件通知处理程序代码
    m_strResult += L"6";//6是宽字符
    SetDlgItemText(IDC_STATICRESULT, m_strResult);//IDC_STATICRESULT是显示运算结果的的静态文本框的ID
}

void CCALDlg::OnBnClickedNum7()
{
    // TODO: 在此添加控件通知处理程序代码
    m_strResult += L"7";//8是宽字符
    SetDlgItemText(IDC_STATICRESULT, m_strResult);//IDC_STATICRESULT是显示运算结果的的静态文本框的ID
}

void CCALDlg::OnBnClickedNum8()
{
    m_strResult += L"8";//8是宽字符
    SetDlgItemText(IDC_STATICRESULT, m_strResult);//IDC_STATICRESULT是显示运算结果的的静态文本框的ID
}

void CCALDlg::OnBnClickedNum9()
{
    // TODO: 在此添加控件通知处理程序代码
    m_strResult += L"9";//9是宽字符
    SetDlgItemText(IDC_STATICRESULT, m_strResult);//IDC_STATICRESULT是显示运算结果的的静态文本框的ID
}

void CCALDlg::OnBnClickedButton17()//数字0忘记改ID为IDC_NUM0了
{
    // TODO: 在此添加控件通知处理程序代码
    m_strResult += L"0";//0是宽字符
    SetDlgItemText(IDC_STATICRESULT, m_strResult);//IDC_STATICRESULT是显示运算结果的的静态文本框的ID
}

2.清除功能的代码

void CCALDlg::OnBnClickedClear()//清除的事件函数
{
    SetDlgItemText(IDC_STATICRESULT, L"0");//运算结果的文本框显示未0
    SetDlgItemText(IDC_STATICSHOW, L"0");//显示输入过程的show文本框也一起清空
    // TODO: 在此添加控件通知处理程序代码
    m_strResult.Empty();//直接清空
    //之前定义好的公有成员变量都清空
    m_strShow.Empty();//显示的字符串也清空
    m_strTemp.Empty();//中间变量也清空
    m_num = 0;//数字变成0
    m_result = 0;//double计算机内运算的结果也等于0
    m_symbol = 0;
}

3.退格功能的代码

void CCALDlg::OnBnClickedBackone()//back_one退格的事件函数
{
    // TODO: 在此添加控件通知处理程序代码
    //减字符串
    if (m_strResult.IsEmpty())//如果字符串是空
    {
        SetDlgItemText(IDC_STATICRESULT, L"0");
    }
    else if (m_strResult.GetLength() == 1)//如果长度是1
    {
        m_strResult = m_strResult.Left(m_strResult.GetLength() - 1);
        SetDlgItemText(IDC_STATICRESULT, L"0");
    }
    else
    {
        m_strResult = m_strResult.Left(m_strResult.GetLength() - 1);
        SetDlgItemText(IDC_STATICRESULT, m_strResult);
    }
}

4.加减乘除功能的代码

void CCALDlg::OnBnClickedJiafa()//加
{
    //转出原来的结果
    if (m_strResult.IsEmpty())
    {
        m_num = _wtof(m_strTemp);
    }
    else
    {
        m_num = _wtof(m_strResult);
    }

    if (m_symbol == 0)//用符号做判断
    {
        m_result = m_num;
    }
    else
    {
        switch (m_symbol)
        {
        case'+':
            m_result = m_result + m_num;
            break;
        case'-':
            m_result = m_result - m_num;
            break;
        case'*':
            m_result = m_result * m_num;
            break;
        case'/':
        {
            if (m_num == 0)
            {
                //设置文本提示除数不能为零
                SetDlgItemText(IDC_STATICRESULT, L"除数不能为0");
                m_strResult.Empty();
                m_strShow.Empty();
                m_strTemp.Empty();
                m_num = 0;
                m_result = 0;
                m_symbol = 0;
                return;
            }
            m_result = m_result / m_num;
            break;
        }
        }
    }
    //上面的文本框SHOW显示连续操作文本
    if (m_strResult.IsEmpty())
    {
        m_strShow += m_strTemp + L"+";//临时文本变量m_strTemp
    }
    else
    {
        m_strShow += m_strResult + L"+";
    }
    
    SetDlgItemText(IDC_STATICSHOW, m_strShow);
    //下面的文本框RESULT显示结果,把计算结果转换成文本
    //下面的文本框RESULT显示结果,把计算结果转换成文本
    CString str;
    str.Format(L"%f", m_result);
    SetDlgItemText(IDC_STATICRESULT, str);

    //用字符来记录符号
    m_symbol = '+';
    //清空原来的result
    m_strResult.Empty();
}

void CCALDlg::OnBnClickedJianfa()//减
{
    //转出原来的结果
    if (m_strResult.IsEmpty())
    {
        m_num = _wtof(m_strTemp);
    }
    else
    {
        m_num = _wtof(m_strResult);
    }

    if (m_symbol == 0)//用符号做判断
    {
        m_result = m_num;
    }
    else
    {
        switch (m_symbol)
        {
        case'+':
            m_result = m_result + m_num;
            break;
        case'-':
            m_result = m_result - m_num;
            break;
        case'*':
            m_result = m_result * m_num;
            break;
        case'/':
        {
            if (m_num == 0)
            {
                //设置文本提示除数不能为零
                SetDlgItemText(IDC_STATICRESULT, L"除数不能为0");
                m_strResult.Empty();
                m_strShow.Empty();
                m_strTemp.Empty();
                m_num = 0;
                m_result = 0;
                m_symbol = 0;
                return;
            }
            m_result = m_result / m_num;
            break;
        }
        }
    }
    //上面的文本框SHOW显示连续操作文本
    if (m_strResult.IsEmpty())
    {
        m_strShow += m_strTemp + L"-";//临时文本变量m_strTemp
    }
    else
    {
        m_strShow += m_strResult + L"-";
    }
    SetDlgItemText(IDC_STATICSHOW, m_strShow);
    //下面的文本框RESULT显示结果,把计算结果转换成文本
    CString str;
    str.Format(L"%f", m_result);
    SetDlgItemText(IDC_STATICRESULT, str);

    //用字符来记录符号
    m_symbol = '-';//变这里'-'
    //清空原来的result
    m_strResult.Empty();
}

void CCALDlg::OnBnClickedChengfa()//乘
{
    // TODO: 在此添加控件通知处理程序代码
        //转出原来的结果
    if (m_strResult.IsEmpty())
    {
        m_num = _wtof(m_strTemp);
    }
    else
    {
        m_num = _wtof(m_strResult);
    }

    if (m_symbol == 0)//用符号做判断
    {
        m_result = m_num;
    }
    else
    {
        switch (m_symbol)
        {
        case'+':
            m_result = m_result + m_num;
            break;
        case'-':
            m_result = m_result - m_num;
            break;
        case'*':
            m_result = m_result * m_num;
            break;
        case'/':
        {
            if (m_num == 0)
            {
                //设置文本提示除数不能为零
                SetDlgItemText(IDC_STATICRESULT, L"除数不能为0");
                m_strResult.Empty();
                m_strShow.Empty();
                m_strTemp.Empty();
                m_num = 0;
                m_result = 0;
                m_symbol = 0;
                return;
            }
            m_result = m_result / m_num;
            break;
        }
        }
    }
    //上面的文本框SHOW显示连续操作文本
    if (m_strResult.IsEmpty())
    {
        m_strShow += m_strTemp + L"*";//临时文本变量m_strTemp
    }
    else
    {
        m_strShow += m_strResult + L"*";
    }
    SetDlgItemText(IDC_STATICSHOW, m_strShow);
    //下面的文本框RESULT显示结果,把计算结果转换成文本
    CString str;
    str.Format(L"%f", m_result);
    SetDlgItemText(IDC_STATICRESULT, str);

    //用字符来记录符号
    m_symbol = '*';//变这里'-'
    //清空原来的result
    m_strResult.Empty();
}

void CCALDlg::OnBnClickedChufa()//除
{
    //转出原来的结果
    if (m_strResult.IsEmpty())
    {
        m_num = _wtof(m_strTemp);
    }
    else
    {
        m_num = _wtof(m_strResult);
    }
    

    if (m_symbol == 0)//用符号做判断
    {
        m_result = m_num;
    }
    else
    {
        switch (m_symbol)
        {
        case'+':
            m_result = m_result + m_num;
            break;
        case'-':
            m_result = m_result - m_num;
            break;
        case'*':
            m_result = m_result * m_num;
            break;
        case'/':
        {
            if (m_num == 0)
            {
                //设置文本提示除数不能为零
                SetDlgItemText(IDC_STATICRESULT, L"除数不能为0");
                m_strResult.Empty();
                m_strShow.Empty();
                m_strTemp.Empty();
                m_num = 0;
                m_result = 0;
                m_symbol = 0;
                return;
            }
            m_result = m_result / m_num;
            break;
        }
        }
    }
    //上面的文本框SHOW显示连续操作文本
    if (m_strResult.IsEmpty())
    {
        m_strShow += m_strTemp + L"/";//临时文本变量m_strTemp
    }
    else
    {
        m_strShow += m_strResult + L"/";
    }
    SetDlgItemText(IDC_STATICSHOW, m_strShow);
    //下面的文本框RESULT显示结果,把计算结果转换成文本
    CString str;
    str.Format(L"%f", m_result);
    SetDlgItemText(IDC_STATICRESULT, str);

    //用字符来记录符号
    m_symbol = '/';//变这里'-'
    //清空原来的result
    m_strResult.Empty();
}

5.小数点功能的代码

void CCALDlg::OnBnClickedButton18()//小数点
{
    if (m_strResult.Find(L".") != -1)//有小数点
    {
        return;
    }
    else
    {
        m_strResult += L".";
        SetDlgItemText(IDC_STATICRESULT, m_strResult);
    }
}

6.正负号功能的代码

void CCALDlg::OnBnClickedZhengfu()//正负号
{
    if (m_strTemp.IsEmpty())
    {
        m_num = _wtof(m_strResult);
    }
    else
    {
        m_num= _wtof(m_strTemp);
    }
    m_num = -m_num;//取反
    m_strResult.Format(L"%lf", m_num);
    SetDlgItemText(IDC_STATICRESULT, m_strResult);
    m_symbol = 0;//清楚符号
}

7.等于功能的代码

void CCALDlg::OnBnClickedDengyu()//等于
{
    // TODO: 在此添加控件通知处理程序代码
    m_num = _wtof(m_strResult);
    switch (m_symbol)
    {
    case'+':
        m_result = m_result + m_num;
        break;
    case'-':
        m_result = m_result - m_num;
        break;
    case'*':
        m_result = m_result * m_num;
        break;
    case'/':
    {
        if (m_num == 0)
        {
            //设置文本提示除数不能为零
            SetDlgItemText(IDC_STATICRESULT, L"除数不能为0");
            m_strResult.Empty();
            m_strShow.Empty();
            m_strTemp.Empty();
            m_num = 0;
            m_result = 0;
            m_symbol = 0;
            return;
        }
        m_result = m_result / m_num;
        break;
    }
    case 0:
        SetDlgItemText(IDC_STATICRESULT, m_strResult);
        break;
    }
    //显示结果
    //下面的文本框RESULT显示结果,把计算结果转换成文本
    CString str;
    str.Format(L"%f", m_result);
    SetDlgItemText(IDC_STATICRESULT, str);

    m_strTemp = m_strResult = str;//中间变量 备份 及时更新结果
    m_strResult.Empty();//清空原有内容
    m_symbol = 0;//清空符号
}

六、源码领取方式

可以去我上传的资源里找(这个下载需要积分),没有积分的小伙伴可以点赞收藏后发送MFC计算器 私信领取百度网盘链接

标签: mfc c++ 界面设计

本文转载自: https://blog.csdn.net/qq_58619891/article/details/128211994
版权归原作者 L洛L 所有, 如有侵权,请联系我们删除。

“MFC基于对话框——仿照Windows计算器制作C++简易计算器”的评论:

还没有评论