基于MFC框架的计算器小程序

发布时间 2023-10-06 21:07:43作者: hsdhfgw

MFC介绍:

MFC(Microsoft Foundation Classes)是微软公司开发的一组C++类库,旨在简化Windows应用程序的开发。它提供了一系列用于创建和管理图形用户界面(GUI)的类和函数,为开发人员提供了丰富的工具和资源,用于构建功能强大的Windows应用程序。

我使用Visual Studio 2022的MFC模板开发的我的计算器.exe应用程序。

1.首先在控件头文件test_computerDlg.h中用枚举创建一些符号常量指代各种运算。

enum Calculator_Flag {
FLAG_JIA,
FLAG_JIAN,
FLAG_CHENG,
FLAG_CHU,
FLAG_NFANG, //n方
FLAG_KAINFANG, //开n方
FLAG_PINGFANG,//平方
FLAG_KAIFANG,//开方
FLAG_LIFANG,//立方
FLAG_KAILIFANG,//开立方
FLAG_EX, //e的x次方

FLAG_SIN,//正弦
FLAG_COS,//余弦
FLAG_TAN,//正切
FLAG_MOD, //模运算
FLAG_N, //n的阶乘
FLAG_LNX, //以10为低的对数
FLAG_LOGNX,//对数运算
FLAG_HD,//十六进制到十进制
FLAG_OD,//八进制到十进制
FLAG_BD,//二进制到十进制
FlAG_HEX,//十六进制
FLAG_OCT,//八进制
FLAG_BIN//二进制
};

2.接着在控件类CtestcomputerDlg声明输入框的变量

private://将变量声明在private中体现了类的封装特性
CString mStr;//编辑框1内的字符串
CString mStr1;//编辑框2内的字符串
CString mStr2;
CString mStr3;
CString mStr4;
CString mStr5;
CString mStr6;
CString mStr7;
CString mStr8;
CString mTempStr;///中间变量
double mNum1;//运算数
double mNum2;
Calculator_Flag mFlag;//运算符号

3.接着在CtestcomputerDlg::DoDataExchange函数中将用户界面的输入框与变量相关联

void CtestcomputerDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, mStr);//将mStr变量与输入框IDC_EDIT1关联
DDX_Text(pDX, IDC_EDIT2, mStr1);
DDX_Text(pDX, IDC_EDIT3, mStr2);
DDX_Text(pDX, IDC_EDIT4, mStr3);
DDX_Text(pDX, IDC_EDIT5, mStr4);
DDX_Text(pDX, IDC_EDIT6, mStr5);
DDX_Text(pDX, IDC_EDIT7, mStr6);
DDX_Text(pDX, IDC_EDIT8, mStr7);
DDX_Text(pDX, IDC_EDIT9, mStr8);
}

4.定义每个按钮的点击函数

直接在这个界面上拖动来实现页面布局。
其中主要用到了工具箱里面的Button,Edit Control这两个,有8个Edit Control编辑框和45个按钮以及一个Static text用于显示历史记录四个静态文本。

在上面页面的每个按钮控件上双击,就自动在class CtestcomputerDlg : public CDialogEx这个类里面的public部分生成了相应的函数声明。

然后自己就需要在text_computerDlg.cpp控件实现文件中实现这些函数的定义。

例如双击   返回    这个按钮。将会在text_computerDlg.h文件的class CtestcomputerDlg : public CDialogEx类里面的public部分(函数是类对外部提供的接口)生成一个afx_msg void OnBnClickedButton1();的声明。

现在就需要在text_computerDlg.cpp中定义这个函数:

void CtestcomputerDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
if (!mStr.IsEmpty()) {//判断是否为空,若不空,则
mStr = mStr.Left(mStr.GetLength() - 1);//去掉字符串最后一个字符,left从左边开始取
}
UpdateData(FALSE);
}

以次完成45个函数的声明以及定义,。

5.声明并定义下面这两个函数。

void SaveFirstValue();//保存第一个输入值--------------------------------------------在控件类头文件中声明

void CtestcomputerDlg::SaveFirstValue()------------------------在控件类的实现文件中定义
{
UpdateData(TRUE);
mNum1 = _wtof(mStr);//第一个运算数
mTempStr = mStr;//中间变量 为了构建历史记录
mStr = L"";//至空输入框 为了输入第二个运算数
UpdateData(FALSE);
}


void Calculator();//计算 ---------------------------------------在控件类头文件中声明

void CtestcomputerDlg::Calculator()---------------------------在控件类的实现文件中定义
{
UpdateData(TRUE);
mNum2 = _wtof(mStr);//第二个运算数 _wtof把字符串内容转换为浮点数
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;
case FLAG_NFANG: // n次方
result = pow(mNum1, 1.0/mNum2);
mTempStr = mTempStr + _T("^") + mStr + _T("=");
break;
case FLAG_KAINFANG://开n方
result = pow(mNum1, mNum2);
mTempStr = mTempStr + _T("^") + mStr + _T("=");
break;
case FLAG_MOD://模运算
result = (int)mNum1 % (int)mNum2;//模运算必须是整数
mTempStr = mTempStr + _T("%") + mStr + _T("=");
break;
case FLAG_LOGNX://对数运算
result = log(mNum2) / log(mNum1);
mTempStr = _T("log") + mTempStr + _T("(") + mStr + _T(")") + _T("=");
break;
case FLAG_PINGFANG://平方
result = mNum2 * mNum2;
mTempStr = mStr + _T("^2=");
break;
case FLAG_KAIFANG://开平方
result = sqrt(mNum2);
mTempStr = _T("根号") + mStr + _T("=");
break;
case FLAG_LIFANG://立方
result = mNum2 * mNum2 * mNum2;
mTempStr = mStr + _T("^3=");
break;
case FLAG_KAILIFANG://开立方
result = pow(mNum2, 1.0 / 3);
mTempStr = _T("开立方") + mStr + _T("=");
break;
case FLAG_SIN: // 正弦
result = sin(mNum2);
mTempStr = _T("sin(") + mStr + _T(")=");
break;
case FLAG_COS://余弦
result = cos(mNum2);
mTempStr = _T("cos(") + mStr + _T(")=");
break;
case FLAG_TAN://正切
result = tan(mNum2);
mTempStr = _T("tan(") + mStr + _T(")=");
break;
case FLAG_EX://e的x次方
{
double e = exp(1.0);
result = pow(e, mNum2);
mTempStr = _T("e^") + mStr + _T("=");
}
break;
case FLAG_N://计算n的阶乘
{
int n = (int)mNum2;
if (n == 0)
{
result = 1;
mTempStr = mStr + _T("!=");
}
else if (n < 0)
{
mTempStr = _T("负数没有阶乘");
}
else {
result = 1;
for (int i = 1; i <= n; i++) {
result *= i;
}
mTempStr = 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;//将结果与表达式拼接
mStr8 = mStr7;
mStr7 = mStr6;
mStr6 = mStr5;
mStr5 = mStr4;
mStr4 = mStr3;
mStr3 = mStr2;
mStr2 = mStr1;
mStr1 = mTempStr;
UpdateData(FALSE);
mNum1 = result;
mNum2 = 0.0f;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

通过以上步骤就基本完成了基于MFC框架的用C++语言实现的计算器小程序。太多了,,,,,主要计算过程都是在最后这个”计算“函数中实现的。对于老师说的那个什么牛顿的还没有实现。另外进制

之间的转换还未完成。以下是实际情况。