首页 > 编程语言 >基于MFC框架的计算器小程序

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

时间:2023-10-06 21:12:11浏览次数:45  
标签:控件 MFC 框架 mTempStr mStr FLAG 计算器 CtestcomputerDlg IDC

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: 在此添加控件通知处理程序代码
}

标签:控件,MFC,框架,mTempStr,mStr,FLAG,计算器,CtestcomputerDlg,IDC
From: https://www.cnblogs.com/bigbabyone/p/17745010.html

相关文章

  • pig4cloud框架系列三:密码模式换取token(登录认证)
    1,通过apiFox或者postMan模拟调用接口,使用密码模式获取token 2,首先代码会先来到ProviderManager类的authenticate方法,也就是登录认证的入口 3,先到AuthenticationProvider接口,然后到AbstractUserDetailsAuthenticationProvider实现类的authenticate方法 4,authenticate方法......
  • pig4cloud框架系列二:表结构浅析
    继系列一后,此篇简单讲一下表结构及每个表的作用1,sys_user:用户表,存储用户信息。2,sys_role:角色表3,sys_user_role:用户角色的定义,一个用户可以有多个角色,1对多的关系。4,sys_menu:菜单表,项目所有的菜单都维护在该表中。5,sys_role_menu:角色菜单表,定义每种角色具有哪些菜单,用户权限的......
  • pig4cloud框架系列一:demo下载及其使用
    pig4cloud就是一个封装的springcloud框架,本文就自己的使用,简单记录一下实践结果,以下操作都是基于windows系统。1,首先从pig4cloud的官网拉取demo,官网地址:https://www.pig4cloud.com/ 2,根据官方快速开始步骤指导,搭建项目,注意一点,不同JDK的版本对应不同的demo,注意别下载错了。3......
  • 【python自动化】七月PytestAutoApi开源框架学习笔记(二)
    执行流程注:请先阅读作者的README.md文档https://gitee.com/yu_xiao_qi/pytest-auto-api2/blob/master/README.md本节内容目录如下:文章目录执行流程目录结构参数配置入口文件-run.pypytest.initest_case初始化数据缓存解析yaml测试数据测试用例执行conftest.py用例demo分析加载yaml......
  • Spring Mvc框架环境搭建
    1.创建动态WEB项目本次在IDEA2021.2.1版本中创建SpringMV 出现webapp文件夹则说明文件创建好啦!2.配置TomCat配置完之后,让我们来运行一下! 配置成功了!!!配置Spring前端控制器<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="<http://maven.apache.org/......
  • stepci 开源api 自动测试框架
    stepci是基于nodejs开发的,开源api自动测试框架包含的特性语言无关 可以基于yaml,json,js定义支持多种框架 rest,graphl,grpc,trpc,soap自托管 可以集成到ci/cd中,同时可以自己部署与行可集成 可以很好的与其他工具集成说明stepci目前也支持负载测试(预览状态),同时还支持f......
  • Windows 10 VS2015旧项目缺少MFC42D.DLL, MFCD42D.DLL, mfco42d.dll, MSVCP60D.DLL和M
    文章目录问题解决参考问题在Windows10中的VS2015找开旧项目,由于缺少MFC42D.DLL,MFCD42D.DLL,mfco42d.dll,MSVCP60D.DLL和MSVCRTD.DLL,无法调试并运行程序,进行了解决。解决下载MFC42D.DLL,MFCD42D.DLL,mfco42d.dll,MSVCP60D.DLL和MSVCRTD.DLL这些DLL文件,旧系统中是可以放在......
  • 1.若依框架介绍与环境搭建
    文章目录若依框架介绍官网地址相关技术栈环境搭建1.git介绍下载与安装学习资料2.maven介绍与下载环境变量配置资料学习3.node4.java5.idea6.vscode7.mysql可视化工具HeidiSql8.redis参考资料遇到问题若依框架介绍官网地址若依框架官网地址:http://www.ruoyi.vip/gitee地址:https://......
  • vxetable使用时,即需要传自己的参数,还需要使用框架原有参数
    例如普通调用时只需要传入 change="changeBtnTypeOpenx(index,$rowIndex)"当需要传入默认返回的值时,则采用 change="changeBtnTypeOpenx($event,index,$rowIndex)"注意调用时增加了$event参数。同样在被调用的函数里要接收这些参数changeBtnTypeOpenx(event,index,rowIn......
  • WPF ABP框架更新(2023-10月份)
    更新说明本次更新主要内容以下:优化UI显示样式,按钮、文字显示模糊、边距一致性更新Syncfusion版本框架版本升级至.NET7ABP版本升级至8.0......