用vs2013MFC制作简易计算器

第一次写计算器,自己制作的计算器下载:

https://download.csdn.net/download/cai_niaocainiao/10594663

第一步参考博客:【基于VS2010的MFC编程】多功能计算器

相同的内容在这里就不说了,先说自己遇到的问题:
(1):创建MFC时遇到:error RC1015

解决方案:项目名右击->属性-->vc++目录-->包含目录-->编辑-(如下两张):

点击蓝圈圈里的添加,添加:$(WindowsSDK_IncludePath)

同样的在库目录里添加:$(WindowsSDK_LibraryPath_x86)

改完之后在调试-->启动调试,对话框就出来了,

关于对话框操作如参考博客就行。

(2)关于代码方面我做了一点改变:(这里可以按我的代码写也可以按照参考博客里的代码写

设计好主对话框后,开始双击按钮进入主程序中相应的位置,添加消息处理程序。
(1)首先在××Dlg.h(主程序头文件,××是你建立的工程名,如工程名为“多功能计算器”,则主程序头文件为“多功能计算器Dlg.h”)中主对话框类中的公有成员(public:)中添加代码,如下图所示,红框内为手动添加的代码:

2)在××Dlg.cpp主程序中添加如下代码:
①在程序顶部包含cmath头文件:#include “cmath”(因为开方函数sqrt()、指数函数pow()需要该头文件)
②在初始化函数BOOL C多功能计算器Dlg::OnInitDialog()中添加m_edit.SetWindowText(“”);将编辑框初始化为空

③双击主对话框中的按钮,主程序会自动添加其消息响应函数,在函数体中添加实现代码:

A、“关于软件”“后退”“清零”按钮的代码:(一样)

B.关于“+”,“-”“*” “/" 代码如下:
 

void CMFCTestzxzxDlg::OnBnClickedAdd()              //"+"

{
	// TODO:  在此添加控件通知处理程序代码
	
	SaveValuel();  //执行SaveValuel()函数,保存第一个数值并
	UpdateData(TRUE);
	m_str = m_str + "+";
	UpdateData(FALSE);
	m_istrle = strlen(m_str);    //求目前字符串的长度
	m_iSign = 0;   //“+”的标志,用于Calculater()函数中case的跳转判断
}


void CMFCTestzxzxDlg::OnBnClickedDec()                //"-"
{
	// TODO:  在此添加控件通知处理程序代码
	SaveValuel();  //执行SaveValuel()函数,保存第一个数值
	UpdateData(TRUE);
	m_str = m_str + "-";
	UpdateData(FALSE);
	m_istrle = strlen(m_str);
	m_iSign = 1;   //“-”的标志,用于Calculater()函数中case的跳转判断
}


void CMFCTestzxzxDlg::OnBnClickedMultiply()             //"×”
{
	// TODO:  在此添加控件通知处理程序代码
	SaveValuel();
	UpdateData(TRUE);
	m_str = m_str + "*";
	UpdateData(FALSE);
	m_istrle = strlen(m_str);
	m_iSign = 2;
}


void CMFCTestzxzxDlg::OnBnClickedDivide()                   //"÷"
{
	// TODO:  在此添加控件通知处理程序代码
	SaveValuel();
	UpdateData(TRUE);
	m_str = m_str + "/";
	UpdateData(FALSE);
	m_istrle = strlen(m_str);
	m_iSign = 3;
}




C:“平方”“开方”“指数”“log”按钮的代码:

void CMFCTestzxzxDlg::OnBnClickedBidcExp()                  //指数
{
	// TODO:  在此添加控件通知处理程序代码
	SaveValuel();
	UpdateData(TRUE);
	m_str = m_str + "^";
	UpdateData(FALSE);
	m_istrle = strlen(m_str);
	m_iSign = 6;
}


void CMFCTestzxzxDlg::OnBnClickedSquare()              //平方
{
	// TODO:  在此添加控件通知处理程序代码
	UpdateData(TRUE);
	m_fNumber1 = atof(m_str);                 //由于操作数只有一个,因此不需要等到“=”按下时才在编辑框显示
	double f = m_fNumber1*m_fNumber1;
	//如果浮点数是整数
	if (f - int(f) <= 1e-5)
	{
		m_str.Format("%d", (int)f);
	}
	else
	{
		m_str.Format("%f", f);
	}
	UpdateData(FALSE);
}


void CMFCTestzxzxDlg::OnBnClickedSqrt()             //开方
{
	// TODO:  在此添加控件通知处理程序代码
	UpdateData(TRUE);
	m_fNumber1 = atof(m_str);
	double f = sqrt(m_fNumber1);
	if (f - (int)f <= 1e-5)
	{
		m_str.Format("%d", (int)f);
	}
	else
	{
		m_str.Format("%f", f);
	}
	UpdateData(FALSE);
}


void CMFCTestzxzxDlg::OnBnClickedLog()       //以十为底的对数
{
	// TODO:  在此添加控件通知处理程序代码
	UpdateData(TRUE);
	m_fNumber1 = atof(m_str);
	double f = log10(m_fNumber1);
	if (f - (int)f <= 1e-5)
	{
		m_str.Format("%d", (int)f);        //将整数转化为字符
	}
	else
	{
		m_str.Format("%f", f);
	}
	UpdateData(FALSE);
}

D:数字按钮的代码(以数字1按钮为例,其他数字类似):

void CMFCTestzxzxDlg::OnBnClickedNum1()             //数字1
{
	// TODO:  在此添加控件通知处理程序代码
	UpdateData(TRUE);
	m_str = m_str + "1";
	UpdateData(FALSE);
}

E:"."和“=”代码:

void CMFCTestzxzxDlg::OnBnClickedDemical()      //“."
{
	// TODO:  在此添加控件通知处理程序代码
	UpdateData(TRUE);
	if (-1 == m_str.Find("."))  //找到第一个小数点的位置
	{
		m_str = m_str + ".";
	}
	UpdateData(FALSE);
}


void CMFCTestzxzxDlg::OnBnClickedEqual()  //"="
{
	// TODO:  在此添加控件通知处理程序代码
	UpdateData(TRUE);
//m_iSign=0~3分别对应"+""-""*""÷",m_iSign=6对应指数
	if (m_iSign != 0 && m_iSign != 1 && m_iSign != 2 && m_iSign != 3 && m_iSign != 6)
	{
		m_fNumber1 = atof(m_str);
	}
	//当单击输入数值而没有单击操作符按钮、直接单击“=”时,界面上保持显示第一个操作数
	else
		Calculator();
	UpdateData(FALSE);
}

F:自定义函数:

void CMFCTestzxzxDlg::SaveValuel()
{
	UpdateData(TRUE);
	m_fNumber1 = atof(m_str);  //编辑框显示第一个操作数,atof()把字符串转换成浮点数
	UpdateData(FALSE);
}

//计算,涉及到两个操作数,按下”=“时执行。包括”+“,”-“,”*“,”➗“”指数“
void CMFCTestzxzxDlg::Calculator()
{
	UpdateData(TRUE);
	m_fNumber2 = atof(m_str.Right(m_str.GetLength() - m_istrle));  //获得第二个操作数并显示在编辑框中
	double f = 0.0f;             //f必须初始化,用于保留计算结果
	switch (m_iSign)    //根据m_iSign标志跳转
	{
	case 0:
		f = m_fNumber1 + m_fNumber2;  //加
		break;
	case 1:
		f = m_fNumber1 - m_fNumber2;   //减
		break;
	case 2:
		f = m_fNumber1 * m_fNumber2;     //乘
		break;
	case 3:
		if (m_fNumber2 == 0.0f)                //除法中分母不能为0,为0时执行如下
		{
			MessageBox("除数不能为0!");    //弹出提示信息框
			f = m_fNumber1;
		//除数为0时直接将第一个操作数赋给结果,表示第二个操作数不算,直接继续下一步操作
		}
		else
		{
			f = m_fNumber1 / m_fNumber2;          //除
		}
		break;
	case 6:
		f = pow(m_fNumber1, m_fNumber2);           //指数
		break;
	default:
		break;
	}
	UpdateData(FALSE);
	if (f - int(f) <= 1e-5)
	{
		m_str.Format("%d", (int)f);
	}
	else
	{
		m_str.Format("%f", f);        //double型的数据转换为Cstring型
	}
}

写完之仍有一个问题需要:配置属性-->常规-->字符集改成使用多字节字符集

(3)运行结果展示部分:

(4)使用Installshield 将文件打包成 exe格式安装包 (自己百度搜索即可,很详细)

打开后就可以运行啦

猜你喜欢

转载自blog.csdn.net/cai_niaocainiao/article/details/81157466