MFC基于对话框——仿照Windows计算器制作C++简易计算器

目录

一、界面设计

二、设置成员变量

三、初始化成员变量 

四、初始化对话框

​五、添加控件代码

1.各个数字的代码(0~9)

2.清除功能的代码

3.退格功能的代码

4.加减乘除功能的代码

5.小数点功能的代码

6.正负号功能的代码

7.等于功能的代码

六、源码领取方式


制作好之后是这样的,可以实现加减乘除,连加连减,连乘连除,除数为0会提示,正负号的运算也可以,可以清除所有数据,也可以在输入数据时退格,下方是版权信息

MFC基于对话框——仿照Windows计算器制作C++简易计算器_第1张图片

 

一、界面设计

如下图所示,19个Button按钮,3个静态文本框

MFC基于对话框——仿照Windows计算器制作C++简易计算器_第2张图片

给每个控件做对齐排布,右上角有对齐的工具,并且改上对应的Caption,上方的静态文本框的ID改为IDC_STATICSHOW;下方的文本框ID改为IDC_STATICRESULT,属性里面是不可以直接改字体样式(大小和字体),只能在OnInitDialog写入初始化代码修改,每个button也可以根据自己的命名规则来改(比如我不会的单词,除法,乘法啥的用拼音代替,IDC_CHUFA)

MFC基于对话框——仿照Windows计算器制作C++简易计算器_第3张图片

二、设置成员变量

在CALDlg.h(自己的项目名Dlg.h头文件中),添加公有变量和私有变量

MFC基于对话框——仿照Windows计算器制作C++简易计算器_第4张图片

 MFC基于对话框——仿照Windows计算器制作C++简易计算器_第5张图片

公有变量:

public://自己添加的共有的成员变量
	CString m_strResult;//运算结果的成员变量
	CString m_strShow;//展示
	CString m_strTemp;//临时存储的字符串
	char m_symbol;//符号
	double m_num;//数字
	double m_result;//结果
	afx_msg void OnBnClickedOk();//以确定方式退出

 私有变量:

private:
	//添加两个可以控制字体的类变量
	CFont m_font;
	CStatic m_static;

三、初始化成员变量 

在CALDlg.cpp中的

MFC基于对话框——仿照Windows计算器制作C++简易计算器_第6张图片

初始化代码:

    //初始化成员变量
	m_num = 0;
	m_result = 0;
	m_symbol = 0;

四、初始化对话框

在CALDlg.cpp中找到OnInitDialog,在return TRUE之前添加如下代码

	// TODO: 在此添加额外的初始化代码
	//给计算结果的静态文本框初始化显示为0
	SetDlgItemText(IDC_STATICRESULT, L"0");

	//调整IDC_STATICRESULT的字体
	m_static.SubclassDlgItem(IDC_STATICRESULT, this);
	//m_static.SubclassDlgItem(IDC_STATICSHOW, this);
	m_font.CreatePointFont(200, _T("黑体"));
	m_static.SetFont(&m_font);

初始化字体和初始化文本框的显示结果的:

IDC_STATIC是第二个关于计算的文本框的ID

MFC基于对话框——仿照Windows计算器制作C++简易计算器_第7张图片五、添加控件代码

双击各个控件即可进入对应的事件函数

1.各个数字的代码(0~9)

void CCALDlg::OnBnClickedNum1()//数字1的事件函数
{
	// TODO: 在此添加控件通知处理程序代码
	m_strResult += L"1";//1是宽字符
	SetDlgItemText(IDC_STATICRESULT, m_strResult);//IDC_STATICRESULT是显示运算结果的的静态文本框的ID
	//此处ID报红是正常现象
}


void CCALDlg::OnBnClickedNum2()//数字2的事件函数
{
	// TODO: 在此添加控件通知处理程序代码
	m_strResult += L"2";//2是宽字符
	SetDlgItemText(IDC_STATICRESULT, m_strResult);//IDC_STATICRESULT是显示运算结果的的静态文本框的ID
}


void CCALDlg::OnBnClickedNum3()//数字3
{
	// TODO: 在此添加控件通知处理程序代码
	m_strResult += L"3";//3是宽字符
	SetDlgItemText(IDC_STATICRESULT, m_strResult);//IDC_STATICRESULT是显示运算结果的的静态文本框的ID
}


void CCALDlg::OnBnClickedNum4()//数字4
{
	// TODO: 在此添加控件通知处理程序代码
	m_strResult += L"4";//4是宽字符
	SetDlgItemText(IDC_STATICRESULT, m_strResult);//IDC_STATICRESULT是显示运算结果的的静态文本框的ID
}


void CCALDlg::OnBnClickedNum5()//数字5
{
	// TODO: 在此添加控件通知处理程序代码
	m_strResult += L"5";//5是宽字符
	SetDlgItemText(IDC_STATICRESULT, m_strResult);//IDC_STATICRESULT是显示运算结果的的静态文本框的ID
}


void CCALDlg::OnBnClickedNum6()
{
	// TODO: 在此添加控件通知处理程序代码
	m_strResult += L"6";//6是宽字符
	SetDlgItemText(IDC_STATICRESULT, m_strResult);//IDC_STATICRESULT是显示运算结果的的静态文本框的ID
}


void CCALDlg::OnBnClickedNum7()
{
	// TODO: 在此添加控件通知处理程序代码
	m_strResult += L"7";//8是宽字符
	SetDlgItemText(IDC_STATICRESULT, m_strResult);//IDC_STATICRESULT是显示运算结果的的静态文本框的ID
}


void CCALDlg::OnBnClickedNum8()
{
	m_strResult += L"8";//8是宽字符
	SetDlgItemText(IDC_STATICRESULT, m_strResult);//IDC_STATICRESULT是显示运算结果的的静态文本框的ID
}


void CCALDlg::OnBnClickedNum9()
{
	// TODO: 在此添加控件通知处理程序代码
	m_strResult += L"9";//9是宽字符
	SetDlgItemText(IDC_STATICRESULT, m_strResult);//IDC_STATICRESULT是显示运算结果的的静态文本框的ID
}


void CCALDlg::OnBnClickedButton17()//数字0忘记改ID为IDC_NUM0了
{
	// TODO: 在此添加控件通知处理程序代码
	m_strResult += L"0";//0是宽字符
	SetDlgItemText(IDC_STATICRESULT, m_strResult);//IDC_STATICRESULT是显示运算结果的的静态文本框的ID
}

2.清除功能的代码

void CCALDlg::OnBnClickedClear()//清除的事件函数
{
	SetDlgItemText(IDC_STATICRESULT, L"0");//运算结果的文本框显示未0
	SetDlgItemText(IDC_STATICSHOW, L"0");//显示输入过程的show文本框也一起清空
	// TODO: 在此添加控件通知处理程序代码
	m_strResult.Empty();//直接清空
	//之前定义好的公有成员变量都清空
	m_strShow.Empty();//显示的字符串也清空
	m_strTemp.Empty();//中间变量也清空
	m_num = 0;//数字变成0
	m_result = 0;//double计算机内运算的结果也等于0
	m_symbol = 0;
}

3.退格功能的代码

void CCALDlg::OnBnClickedBackone()//back_one退格的事件函数
{
	// TODO: 在此添加控件通知处理程序代码
	//减字符串
	if (m_strResult.IsEmpty())//如果字符串是空
	{
		SetDlgItemText(IDC_STATICRESULT, L"0");
	}
	else if (m_strResult.GetLength() == 1)//如果长度是1
	{
		m_strResult = m_strResult.Left(m_strResult.GetLength() - 1);
		SetDlgItemText(IDC_STATICRESULT, L"0");
	}
	else
	{
		m_strResult = m_strResult.Left(m_strResult.GetLength() - 1);
		SetDlgItemText(IDC_STATICRESULT, m_strResult);
	}
}

4.加减乘除功能的代码

void CCALDlg::OnBnClickedJiafa()//加
{
	//转出原来的结果
	if (m_strResult.IsEmpty())
	{
		m_num = _wtof(m_strTemp);
	}
	else
	{
		m_num = _wtof(m_strResult);
	}

	if (m_symbol == 0)//用符号做判断
	{
		m_result = m_num;
	}
	else
	{
		switch (m_symbol)
		{
		case'+':
			m_result = m_result + m_num;
			break;
		case'-':
			m_result = m_result - m_num;
			break;
		case'*':
			m_result = m_result * m_num;
			break;
		case'/':
		{
			if (m_num == 0)
			{
				//设置文本提示除数不能为零
				SetDlgItemText(IDC_STATICRESULT, L"除数不能为0");
				m_strResult.Empty();
				m_strShow.Empty();
				m_strTemp.Empty();
				m_num = 0;
				m_result = 0;
				m_symbol = 0;
				return;
			}
			m_result = m_result / m_num;
			break;
		}
		}
	}
	//上面的文本框SHOW显示连续操作文本
	if (m_strResult.IsEmpty())
	{
		m_strShow += m_strTemp + L"+";//临时文本变量m_strTemp
	}
	else
	{
		m_strShow += m_strResult + L"+";
	}
	
	SetDlgItemText(IDC_STATICSHOW, m_strShow);
	//下面的文本框RESULT显示结果,把计算结果转换成文本
	//下面的文本框RESULT显示结果,把计算结果转换成文本
	CString str;
	str.Format(L"%f", m_result);
	SetDlgItemText(IDC_STATICRESULT, str);


	//用字符来记录符号
	m_symbol = '+';
	//清空原来的result
	m_strResult.Empty();
}


void CCALDlg::OnBnClickedJianfa()//减
{
	//转出原来的结果
	if (m_strResult.IsEmpty())
	{
		m_num = _wtof(m_strTemp);
	}
	else
	{
		m_num = _wtof(m_strResult);
	}

	if (m_symbol == 0)//用符号做判断
	{
		m_result = m_num;
	}
	else
	{
		switch (m_symbol)
		{
		case'+':
			m_result = m_result + m_num;
			break;
		case'-':
			m_result = m_result - m_num;
			break;
		case'*':
			m_result = m_result * m_num;
			break;
		case'/':
		{
			if (m_num == 0)
			{
				//设置文本提示除数不能为零
				SetDlgItemText(IDC_STATICRESULT, L"除数不能为0");
				m_strResult.Empty();
				m_strShow.Empty();
				m_strTemp.Empty();
				m_num = 0;
				m_result = 0;
				m_symbol = 0;
				return;
			}
			m_result = m_result / m_num;
			break;
		}
		}
	}
	//上面的文本框SHOW显示连续操作文本
	if (m_strResult.IsEmpty())
	{
		m_strShow += m_strTemp + L"-";//临时文本变量m_strTemp
	}
	else
	{
		m_strShow += m_strResult + L"-";
	}
	SetDlgItemText(IDC_STATICSHOW, m_strShow);
	//下面的文本框RESULT显示结果,把计算结果转换成文本
	CString str;
	str.Format(L"%f", m_result);
	SetDlgItemText(IDC_STATICRESULT, str);


	//用字符来记录符号
	m_symbol = '-';//变这里'-'
	//清空原来的result
	m_strResult.Empty();
}


void CCALDlg::OnBnClickedChengfa()//乘
{
	// TODO: 在此添加控件通知处理程序代码
		//转出原来的结果
	if (m_strResult.IsEmpty())
	{
		m_num = _wtof(m_strTemp);
	}
	else
	{
		m_num = _wtof(m_strResult);
	}

	if (m_symbol == 0)//用符号做判断
	{
		m_result = m_num;
	}
	else
	{
		switch (m_symbol)
		{
		case'+':
			m_result = m_result + m_num;
			break;
		case'-':
			m_result = m_result - m_num;
			break;
		case'*':
			m_result = m_result * m_num;
			break;
		case'/':
		{
			if (m_num == 0)
			{
				//设置文本提示除数不能为零
				SetDlgItemText(IDC_STATICRESULT, L"除数不能为0");
				m_strResult.Empty();
				m_strShow.Empty();
				m_strTemp.Empty();
				m_num = 0;
				m_result = 0;
				m_symbol = 0;
				return;
			}
			m_result = m_result / m_num;
			break;
		}
		}
	}
	//上面的文本框SHOW显示连续操作文本
	if (m_strResult.IsEmpty())
	{
		m_strShow += m_strTemp + L"*";//临时文本变量m_strTemp
	}
	else
	{
		m_strShow += m_strResult + L"*";
	}
	SetDlgItemText(IDC_STATICSHOW, m_strShow);
	//下面的文本框RESULT显示结果,把计算结果转换成文本
	CString str;
	str.Format(L"%f", m_result);
	SetDlgItemText(IDC_STATICRESULT, str);


	//用字符来记录符号
	m_symbol = '*';//变这里'-'
	//清空原来的result
	m_strResult.Empty();
}


void CCALDlg::OnBnClickedChufa()//除
{
	//转出原来的结果
	if (m_strResult.IsEmpty())
	{
		m_num = _wtof(m_strTemp);
	}
	else
	{
		m_num = _wtof(m_strResult);
	}
	

	if (m_symbol == 0)//用符号做判断
	{
		m_result = m_num;
	}
	else
	{
		switch (m_symbol)
		{
		case'+':
			m_result = m_result + m_num;
			break;
		case'-':
			m_result = m_result - m_num;
			break;
		case'*':
			m_result = m_result * m_num;
			break;
		case'/':
		{
			if (m_num == 0)
			{
				//设置文本提示除数不能为零
				SetDlgItemText(IDC_STATICRESULT, L"除数不能为0");
				m_strResult.Empty();
				m_strShow.Empty();
				m_strTemp.Empty();
				m_num = 0;
				m_result = 0;
				m_symbol = 0;
				return;
			}
			m_result = m_result / m_num;
			break;
		}
		}
	}
	//上面的文本框SHOW显示连续操作文本
	if (m_strResult.IsEmpty())
	{
		m_strShow += m_strTemp + L"/";//临时文本变量m_strTemp
	}
	else
	{
		m_strShow += m_strResult + L"/";
	}
	SetDlgItemText(IDC_STATICSHOW, m_strShow);
	//下面的文本框RESULT显示结果,把计算结果转换成文本
	CString str;
	str.Format(L"%f", m_result);
	SetDlgItemText(IDC_STATICRESULT, str);


	//用字符来记录符号
	m_symbol = '/';//变这里'-'
	//清空原来的result
	m_strResult.Empty();
}

5.小数点功能的代码

void CCALDlg::OnBnClickedButton18()//小数点
{
	if (m_strResult.Find(L".") != -1)//有小数点
	{
		return;
	}
	else
	{
		m_strResult += L".";
		SetDlgItemText(IDC_STATICRESULT, m_strResult);
	}
}

6.正负号功能的代码

void CCALDlg::OnBnClickedZhengfu()//正负号
{
	if (m_strTemp.IsEmpty())
	{
		m_num = _wtof(m_strResult);
	}
	else
	{
		m_num= _wtof(m_strTemp);
	}
	m_num = -m_num;//取反
	m_strResult.Format(L"%lf", m_num);
	SetDlgItemText(IDC_STATICRESULT, m_strResult);
	m_symbol = 0;//清楚符号
}

7.等于功能的代码

void CCALDlg::OnBnClickedDengyu()//等于
{
	// TODO: 在此添加控件通知处理程序代码
	m_num = _wtof(m_strResult);
	switch (m_symbol)
	{
	case'+':
		m_result = m_result + m_num;
		break;
	case'-':
		m_result = m_result - m_num;
		break;
	case'*':
		m_result = m_result * m_num;
		break;
	case'/':
	{
		if (m_num == 0)
		{
			//设置文本提示除数不能为零
			SetDlgItemText(IDC_STATICRESULT, L"除数不能为0");
			m_strResult.Empty();
			m_strShow.Empty();
			m_strTemp.Empty();
			m_num = 0;
			m_result = 0;
			m_symbol = 0;
			return;
		}
		m_result = m_result / m_num;
		break;
	}
	case 0:
		SetDlgItemText(IDC_STATICRESULT, m_strResult);
		break;
	}
	//显示结果
	//下面的文本框RESULT显示结果,把计算结果转换成文本
	CString str;
	str.Format(L"%f", m_result);
	SetDlgItemText(IDC_STATICRESULT, str);

	m_strTemp = m_strResult = str;//中间变量 备份 及时更新结果
	m_strResult.Empty();//清空原有内容
	m_symbol = 0;//清空符号
}

六、源码领取方式

可以去我上传的资源里找(这个下载需要积分),没有积分的小伙伴可以点赞收藏后发送MFC计算器 私信领取百度网盘链接

你可能感兴趣的:(MFC,mfc,c++,界面设计)