基于MFC框架的计算器小程序
MFC介绍:
MFC(Microsoft Foundation Classes)是微软公司开发的一组C++类库,旨在简化Windows应用程序的开发。它提供了一系列用于创建和管理图形用户界面(GUI)的类和函数,为开发人员提供了丰富的工具和资源,用于构建功能强大的Windows应用程序。
我使用Visual Studio 2022的MFC模板开发的我的计算器.exe应用程序。老师让加减乘除,自作了主张,多添加了一些计算方式。因为这样就感觉比较完整了。
流程图:
在visual studio 上创建项目
就可以创建一个空白的MFC应用了。
源码链接:https://cowtransfer.com/s/c974df66cb5346
口令:33cp7m
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; }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
在编写时需要注意的是单目运算符与双目运算符的区别就可以了:单目运算在点击一个数字后,在点击运算符,然后点击第二个数字。双目运算符需要先输入第一个数字,再输入运算符,然后点击=按钮。这个等于按钮会调用 ”计算” 函数。单目运算符点击后只执行 mFlag = 运算符代表的枚举量,而双目运算符点击后会先获取第一个数字“SaveFirstValue()”,然后执行mFlag = 运算符代表的枚举量。
通过以上步骤就基本完成了基于MFC框架的用C++语言实现的计算器小程序。太多了,,,,,主要计算过程都是在最后这个”计算“函数中实现的。对于老师说的那个什么牛顿的还没有实现。另外进制
之间的转换还未完成。以下是实际情况。
页面左边是历史记录,最近计算结果会优先显示再第一行,右边是计算器主要按钮。
由于开平方的这个根号键盘上没法输入,就利用 “/” 代替,,第一行是进制转换,第二行是十六进制数。第三行是幂运算与开方运算。
以下是主要实现代码:
// test_computerDlg.cpp: 实现文件 // #include "pch.h" #include "framework.h" #include "test_computer.h" #include "test_computerDlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_ABOUTBOX }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX) { } //关于对话框 void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CtestcomputerDlg 对话框 CtestcomputerDlg::CtestcomputerDlg(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_TEST_COMPUTER_DIALOG, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } //用户界面中的输入框与其变量关联 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); } BEGIN_MESSAGE_MAP(CtestcomputerDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON6, &CtestcomputerDlg::OnBnClickedButton6) ON_BN_CLICKED(IDC_BUTTON43, &CtestcomputerDlg::OnBnClickedButton43) ON_BN_CLICKED(IDC_BUTTON42, &CtestcomputerDlg::OnBnClickedButton42) ON_BN_CLICKED(IDC_BUTTON36, &CtestcomputerDlg::OnBnClickedButton36) ON_BN_CLICKED(IDC_BUTTON37, &CtestcomputerDlg::OnBnClickedButton37) ON_BN_CLICKED(IDC_BUTTON38, &CtestcomputerDlg::OnBnClickedButton38) ON_BN_CLICKED(IDC_BUTTON30, &CtestcomputerDlg::OnBnClickedButton30) ON_BN_CLICKED(IDC_BUTTON31, &CtestcomputerDlg::OnBnClickedButton31) ON_BN_CLICKED(IDC_BUTTON32, &CtestcomputerDlg::OnBnClickedButton32) ON_BN_CLICKED(IDC_BUTTON24, &CtestcomputerDlg::OnBnClickedButton24) ON_BN_CLICKED(IDC_BUTTON25, &CtestcomputerDlg::OnBnClickedButton25) ON_BN_CLICKED(IDC_BUTTON26, &CtestcomputerDlg::OnBnClickedButton26) ON_BN_CLICKED(IDC_BUTTON1, &CtestcomputerDlg::OnBnClickedButton1) ON_BN_CLICKED(IDC_BUTTON3, &CtestcomputerDlg::OnBnClickedButton3) ON_BN_CLICKED(IDC_BUTTON2, &CtestcomputerDlg::OnBnClickedButton2) ON_BN_CLICKED(IDC_BUTTON45, &CtestcomputerDlg::OnBnClickedButton45) ON_BN_CLICKED(IDC_BUTTON44, &CtestcomputerDlg::OnBnClickedButton44) ON_BN_CLICKED(IDC_BUTTON10, &CtestcomputerDlg::OnBnClickedButton10) ON_BN_CLICKED(IDC_BUTTON11, &CtestcomputerDlg::OnBnClickedButton11) ON_BN_CLICKED(IDC_BUTTON12, &CtestcomputerDlg::OnBnClickedButton12) ON_BN_CLICKED(IDC_BUTTON13, &CtestcomputerDlg::OnBnClickedButton13) ON_BN_CLICKED(IDC_BUTTON14, &CtestcomputerDlg::OnBnClickedButton14) ON_BN_CLICKED(IDC_BUTTON15, &CtestcomputerDlg::OnBnClickedButton15) ON_BN_CLICKED(IDC_BUTTON39, &CtestcomputerDlg::OnBnClickedButton39) ON_BN_CLICKED(IDC_BUTTON33, &CtestcomputerDlg::OnBnClickedButton33) ON_BN_CLICKED(IDC_BUTTON27, &CtestcomputerDlg::OnBnClickedButton27) ON_BN_CLICKED(IDC_BUTTON21, &CtestcomputerDlg::OnBnClickedButton21) ON_BN_CLICKED(IDC_BUTTON20, &CtestcomputerDlg::OnBnClickedButton20) ON_BN_CLICKED(IDC_BUTTON19, &CtestcomputerDlg::OnBnClickedButton19) ON_BN_CLICKED(IDC_BUTTON18, &CtestcomputerDlg::OnBnClickedButton18) ON_BN_CLICKED(IDC_BUTTON17, &CtestcomputerDlg::OnBnClickedButton17) ON_BN_CLICKED(IDC_BUTTON16, &CtestcomputerDlg::OnBnClickedButton16) ON_BN_CLICKED(IDC_BUTTON23, &CtestcomputerDlg::OnBnClickedButton23) ON_BN_CLICKED(IDC_BUTTON34, &CtestcomputerDlg::OnBnClickedButton34) ON_BN_CLICKED(IDC_BUTTON41, &CtestcomputerDlg::OnBnClickedButton41) ON_BN_CLICKED(IDC_BUTTON35, &CtestcomputerDlg::OnBnClickedButton35) ON_BN_CLICKED(IDC_BUTTON29, &CtestcomputerDlg::OnBnClickedButton29) ON_BN_CLICKED(IDC_BUTTON28, &CtestcomputerDlg::OnBnClickedButton28) ON_BN_CLICKED(IDC_BUTTON40, &CtestcomputerDlg::OnBnClickedButton40) ON_BN_CLICKED(IDC_BUTTON22, &CtestcomputerDlg::OnBnClickedButton22) ON_BN_CLICKED(IDC_BUTTON4, &CtestcomputerDlg::OnBnClickedButton4) ON_BN_CLICKED(IDC_BUTTON5, &CtestcomputerDlg::OnBnClickedButton5) ON_BN_CLICKED(IDC_BUTTON7, &CtestcomputerDlg::OnBnClickedButton7) ON_BN_CLICKED(IDC_BUTTON8, &CtestcomputerDlg::OnBnClickedButton8) ON_BN_CLICKED(IDC_BUTTON9, &CtestcomputerDlg::OnBnClickedButton9) END_MESSAGE_MAP() // CtestcomputerDlg 消息处理程序 BOOL CtestcomputerDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != nullptr) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CtestcomputerDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CtestcomputerDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CtestcomputerDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } //B->D按钮 void CtestcomputerDlg::OnBnClickedButton6() { // TODO: 在此添加控件通知处理程序代码 mFlag = FLAG_BD; } //按钮0 void CtestcomputerDlg::OnBnClickedButton43() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE);//获取输入框中的值并且赋值给输入框关联的变量 mStr += L"0"; UpdateData(FALSE);//将更改后的值返回给输入框 } //按钮“.” void CtestcomputerDlg::OnBnClickedButton42() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); //如果没有小鼠点,则加上小数点,如果找到小鼠点,则忽略此次点击 if (-1 == mStr.Find(L'.')) { mStr += _T("."); } UpdateData(FALSE); } //按钮1 void CtestcomputerDlg::OnBnClickedButton36() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L"1"; UpdateData(FALSE); } //按钮2 void CtestcomputerDlg::OnBnClickedButton37() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L"2"; UpdateData(FALSE); } //按钮3 void CtestcomputerDlg::OnBnClickedButton38() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L"3"; UpdateData(FALSE); } //按钮4 void CtestcomputerDlg::OnBnClickedButton30() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L"4"; UpdateData(FALSE); } void CtestcomputerDlg::OnBnClickedButton31() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L"5"; UpdateData(FALSE); } void CtestcomputerDlg::OnBnClickedButton32() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L"6"; UpdateData(FALSE); } void CtestcomputerDlg::OnBnClickedButton24() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L"7"; UpdateData(FALSE); } void CtestcomputerDlg::OnBnClickedButton25() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L"8"; UpdateData(FALSE); } void CtestcomputerDlg::OnBnClickedButton26() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L"9"; UpdateData(FALSE); } //返回按钮(消去输入框中最后一个字符) void CtestcomputerDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); if (!mStr.IsEmpty()) {//判断是否为空,若不空,则 mStr = mStr.Left(mStr.GetLength() - 1);//去掉字符串最后一个字符,left从左边开始取 } UpdateData(FALSE); } //清除按钮 void CtestcomputerDlg::OnBnClickedButton3() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE);//获取输入框 mStr = L""; mNum1 = 0.0f; mNum2 = 0.0f; mFlag = FLAG_JIA; UpdateData(FALSE);//输出到输入框 } //清除所有按钮 void CtestcomputerDlg::OnBnClickedButton2() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE);//获取输入框 mStr1 = L""; mStr2 = L""; mStr3 = L""; mStr4 = L""; mStr5 = L""; mStr6 = L""; mStr7 = L""; mStr8 = L""; mStr = L""; mNum1 = 0.0f; mNum2 = 0.0f; mFlag = FLAG_JIA; UpdateData(FALSE);//输出到输入框 } //保存第一个输入值 void CtestcomputerDlg::SaveFirstValue() { UpdateData(TRUE); mNum1 = _wtof(mStr);//第一个运算数 mTempStr = mStr;//中间变量 为了构建历史记录 mStr = L"";//至空输入框 为了输入第二个运算数 UpdateData(FALSE); } //计算 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; } //点击+按钮 void CtestcomputerDlg::OnBnClickedButton45() { // TODO: 在此添加控件通知处理程序代码 SaveFirstValue();//保存第一个运算数 mFlag = FLAG_JIA;//设置运算符 } //点击=按钮 void CtestcomputerDlg::OnBnClickedButton44() { // TODO: 在此添加控件通知处理程序代码 Calculator();//调用运算方法 } //点击A按钮 void CtestcomputerDlg::OnBnClickedButton10() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L"A"; UpdateData(FALSE); } //点击B按钮 void CtestcomputerDlg::OnBnClickedButton11() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L"B"; UpdateData(FALSE); } //点击C按钮 void CtestcomputerDlg::OnBnClickedButton12() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L"C"; UpdateData(FALSE); } //点击D按钮 void CtestcomputerDlg::OnBnClickedButton13() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L"D"; UpdateData(FALSE); } //点击E按钮 void CtestcomputerDlg::OnBnClickedButton14() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L"E"; UpdateData(FALSE); } //点击F按钮 void CtestcomputerDlg::OnBnClickedButton15() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); mStr += L"F"; UpdateData(FALSE); } //点击-按钮 void CtestcomputerDlg::OnBnClickedButton39() { // TODO: 在此添加控件通知处理程序代码 SaveFirstValue();//保存第一个运算数 mFlag = FLAG_JIAN;//设置运算符 } //点击x按钮 void CtestcomputerDlg::OnBnClickedButton33() { // TODO: 在此添加控件通知处理程序代码 SaveFirstValue();//保存第一个运算数 mFlag = FLAG_CHENG;//设置运算符 } //点击/按钮 void CtestcomputerDlg::OnBnClickedButton27() {//双目运算符 // TODO: 在此添加控件通知处理程序代码 SaveFirstValue();//保存第一个运算数 mFlag = FLAG_CHU;//设置运算符 } //点击x^2按钮 void CtestcomputerDlg::OnBnClickedButton21() { // TODO: 在此添加控件通知处理程序代码 mFlag = FLAG_PINGFANG;//设置运算符 } //点击2/x按钮 void CtestcomputerDlg::OnBnClickedButton20() { // TODO: 在此添加控件通知处理程序代码 mFlag = FLAG_KAIFANG; } //点击x^3按钮 void CtestcomputerDlg::OnBnClickedButton19() { // TODO: 在此添加控件通知处理程序代码 mFlag = FLAG_LIFANG;//单目运算符 } //点击3/x按钮 void CtestcomputerDlg::OnBnClickedButton18() { // TODO: 在此添加控件通知处理程序代码 mFlag = FLAG_KAILIFANG; } //点击x^n void CtestcomputerDlg::OnBnClickedButton17() { // TODO: 在此添加控件通知处理程序代码 SaveFirstValue(); mFlag = FLAG_KAINFANG; } //点击n/x void CtestcomputerDlg::OnBnClickedButton16() { // TODO: 在此添加控件通知处理程序代码 SaveFirstValue();//双目运算符,先保存第一个运算数 mFlag = FLAG_NFANG; } //点击%按钮 void CtestcomputerDlg::OnBnClickedButton23() { // TODO: 在此添加控件通知处理程序代码 SaveFirstValue(); mFlag = FLAG_MOD; } //点击lognX void CtestcomputerDlg::OnBnClickedButton34() { // TODO: 在此添加控件通知处理程序代码 SaveFirstValue(); mFlag = FLAG_LOGNX; } //点击tanX void CtestcomputerDlg::OnBnClickedButton41() { // TODO: 在此添加控件通知处理程序代码 mFlag = FLAG_TAN; } //点击cosX void CtestcomputerDlg::OnBnClickedButton35() { // TODO: 在此添加控件通知处理程序代码 mFlag = FLAG_COS; } //点击sinX void CtestcomputerDlg::OnBnClickedButton29() { // TODO: 在此添加控件通知处理程序代码 mFlag = FLAG_SIN; } //点击lnX void CtestcomputerDlg::OnBnClickedButton28() { // TODO: 在此添加控件通知处理程序代码 mFlag = FLAG_LNX; } //点击e^x void CtestcomputerDlg::OnBnClickedButton40() { // TODO: 在此添加控件通知处理程序代码 mFlag = FLAG_EX; } //点击n!按钮 void CtestcomputerDlg::OnBnClickedButton22() { // TODO: 在此添加控件通知处理程序代码 mFlag = FLAG_N; } //H->D按钮 void CtestcomputerDlg::OnBnClickedButton4() { // TODO: 在此添加控件通知处理程序代码 mFlag = FLAG_HD; } //O->D void CtestcomputerDlg::OnBnClickedButton5() { // TODO: 在此添加控件通知处理程序代码 mFlag = FLAG_OD; } //Hex void CtestcomputerDlg::OnBnClickedButton7() { // TODO: 在此添加控件通知处理程序代码 } //Oct void CtestcomputerDlg::OnBnClickedButton8() { // TODO: 在此添加控件通知处理程序代码 } //Bin void CtestcomputerDlg::OnBnClickedButton9() { // TODO: 在此添加控件通知处理程序代码 }
// test_computerDlg.h: 头文件 // #pragma once //运算符 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//二进制 }; // CtestcomputerDlg 对话框 用户界面类以及类中的函数和变量 class CtestcomputerDlg : public CDialogEx { // 构造 public: CtestcomputerDlg(CWnd* pParent = nullptr); // 标准构造函数 void SaveFirstValue();//保存第一个输入值 void Calculator();//计算 // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_TEST_COMPUTER_DIALOG }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: HICON m_hIcon; // 生成的消息映射函数 virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() //控件的变量,,,即输入框的变量 在这里声明后需要在test_computerDlg.cpp文件中关联 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;//运算符号 public: //点击按钮自动生成的函数声明,函数原型在test_computerDlg.cpp文件中 //这些都是按钮你的消息处理函数 afx_msg void OnBnClickedButton6(); afx_msg void OnBnClickedButton43(); afx_msg void OnBnClickedButton42(); afx_msg void OnBnClickedButton36(); afx_msg void OnBnClickedButton37(); afx_msg void OnBnClickedButton38(); afx_msg void OnBnClickedButton30(); afx_msg void OnBnClickedButton31(); afx_msg void OnBnClickedButton32(); afx_msg void OnBnClickedButton24(); afx_msg void OnBnClickedButton25(); afx_msg void OnBnClickedButton26(); afx_msg void OnBnClickedButton1(); afx_msg void OnBnClickedButton3(); afx_msg void OnBnClickedButton2(); afx_msg void OnBnClickedButton45(); afx_msg void OnBnClickedButton44(); afx_msg void OnBnClickedButton10(); afx_msg void OnBnClickedButton11(); afx_msg void OnBnClickedButton12(); afx_msg void OnBnClickedButton13(); afx_msg void OnBnClickedButton14(); afx_msg void OnBnClickedButton15(); afx_msg void OnBnClickedButton39(); afx_msg void OnBnClickedButton33(); afx_msg void OnBnClickedButton27(); afx_msg void OnBnClickedButton21(); afx_msg void OnBnClickedButton20(); afx_msg void OnBnClickedButton19(); afx_msg void OnBnClickedButton18(); afx_msg void OnBnClickedButton17(); afx_msg void OnBnClickedButton16(); afx_msg void OnBnClickedButton23(); afx_msg void OnBnClickedButton34(); afx_msg void OnBnClickedButton41(); afx_msg void OnBnClickedButton35(); afx_msg void OnBnClickedButton29(); afx_msg void OnBnClickedButton28(); afx_msg void OnBnClickedButton40(); afx_msg void OnBnClickedButton22(); afx_msg void OnBnClickedButton4(); afx_msg void OnBnClickedButton5(); afx_msg void OnBnClickedButton7(); afx_msg void OnBnClickedButton8(); afx_msg void OnBnClickedButton9(); };