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++语言实现的计算器小程序。太多了,,,,,主要计算过程都是在最后这个”计算“函数中实现的。对于老师说的那个什么牛顿的还没有实现。另外进制
之间的转换还未完成。以下是实际情况。
以下是主要实现代码:
// 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: 在此添加控件通知处理程序代码
}