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

news2024/9/22 11:25:41

目录

一、界面设计

二、设置成员变量

三、初始化成员变量 

四、初始化对话框

​五、添加控件代码

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

2.清除功能的代码

3.退格功能的代码

4.加减乘除功能的代码

5.小数点功能的代码

6.正负号功能的代码

7.等于功能的代码

六、源码领取方式


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

 

一、界面设计

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

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

二、设置成员变量

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

 

公有变量:

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中的

初始化代码:

    //初始化成员变量
	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

五、添加控件代码

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

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计算器 私信领取百度网盘链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/67855.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法day42|背包问题

目录 01背包问题 二维 01背包问题 一维 416. 分割等和子集 背包问题分为:01背包,完全背包,多种背包01背包指的是有n种物品,每种物品只能取一个完全背包指的是有n种物品,每种物品可以取无限个多种背包指的是有n种物品,每…

公众号网课搜题接口

公众号网课搜题接口 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 查题校园题库:查题校园题库后台(点击…

常用的在线工具网站

1,在线Photoshop软件 https://www.uupoop.com/ PS在线图片编辑器是一个专业精简的在线ps图片照片制作处理软件工具,绿色免安装,免下载,直接在浏览器打开就可用它修正,调整和美化图像。 2,bilibili视频编辑器 https://bilibili.clipchamp.com/ 由哔哩哔哩…

(保姆级)国内1块钱注册火爆全网的OpenAI-ChatGPT机器人

下面有给出完整的注册流程。首先介绍一下它是什么,如果只想看注册往下翻! 1块钱注册火爆全网的OpenAI-ChatGPT机器人OpengAI-ChatGPT能做什么如何注册1块钱收取验证码使用注册的账号登录ChatGPTOpengAI-ChatGPT能做什么 我作为一个程序员用了一段时间&a…

金蝶云星空生产管理(冲刺学习)

物料“基本”和“生产”相关属性字段介绍 物料属性:生产中常用的物料属性包括自制、委外、外购、虚拟、配置、特征。 自制:一般是指由企业自己生产的物料,一般会建BOM、生产订单; 委外:是指委托给其他加工单位进行加工…

DevTools 无法加载来源映射:无法加载 chrome-extension: 警告的原因以及如何去除(全网最全 最详细解决方案)

是类似这样的一个警告。每次都有看着还是挺难受的。 这个警告的原因是你的浏览器插件造成的。例如警告已经很明确的告诉你是chrome-extension,也就是谷歌插件的问题。后面的字符串其实就是这个插件的id。 chrome-extension://cfhdojbkjhnklbpkdaibdccddilifddb/br…

QT笔记——QSlider滑动条滚轮事件和点击鼠标位置事件问题

需求:我们需要对一个滑动条 滚轮事件 和 点击到滑动条的位置 实时显示 问题:其中在做的时候遇到了很多的问题,一开始感觉很简单,现在将这些问题记录下来 ui图: 问题1:处理QSlider 滚轮事件的时候 这里有…

AlphaFold2源码解析(8)--模型之三维坐标构建

AlphaFold2源码解析(8)–模型之三维坐标构建 这个模块我们讲解AlphaFold的Structure module模块,该结构模块将蛋白质结构的抽象表示映射为具体的三维原子坐标。 Evoformer的单一表征被用作初始单一表征siinitial{s^{initial}_i }siinitial​,siinitial∈…

同步整流 降压恒流 输入4-40V 功率可达40W 电流3.6A 原理图

◆PCB 布线参考PCB 布局应遵循如下规则以确保芯片的正常工作。1:功率线包括地线,LX线和VIN线应该尽量做到短、 直和宽。2:输入电容应尽可能靠近芯片管脚(VIN 和 )。输入电源引脚可增加一个 0.1uF 的陶瓷电容以增强芯片的抗高频噪声能力。3:功…

小迪-day13(MySQL注入)

一、information_schema information_schema 数据库跟 performance_schema 一样,都是 MySQL 自带的信息数据库。其中 performance_schema 用于性能分析,而 information_schema 用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列…

信号和电源隔离的有效设计技术

介绍 如今,电子产品设计师比以往任何时候都更面临着一系列共同的目标:实现更高的吞吐量、更高的分辨率、更高效的系统和缩短上市时间。在工业自动化、医疗电子或电信系统等领域,通常需要电隔离多个信号,以使子系统能够共享数据或…

农民歌唱家大衣哥外出商演,大衣嫂在家晒麦子,真是一对金童玉女

在中国华语乐坛,曾经有很多对模范夫妻,比如说任静和付笛声,他们也是音乐领域的金童玉女。其实大家都忽略了一对夫妻,农民歌唱家大衣哥,和他的结发妻子玉华,同样是中国华语乐坛的骄傲。 只是因为大衣哥过于低…

计算机网络复习(一~三)

第一章 基本概念 1-01.计算机网络可以向用户提供哪些服务? 答:例如音频,视频,游戏等,但本质是提供连通性和共享这两个功能。连通性:计算机网络使上网用户之间可以交换信息,好像这些用户的计算…

RDPCrystal EDI SDK 10.0.4.X Crack

关于 RDPCrystal EDI 库 使用 .NET、NodeJS、JavaScript 或 .NET Core 创建、查看和验证 EDI 数据。 RDPCrystal EDI 库是一套 EDI 组件(.NET、NodeJS/JavaScript 和 .NET Core),可以创建和操作任何 X12 标准文件。功能包括解析、连接、拆分、…

【Unity】填坑,Unity接入Epic Online Service上架Epic游戏商城

EOS SDK For Unity地址:https://github.com/PlayEveryWare/eos_plugin_for_unity_upm Epic是虚幻游戏引擎开发商,2018年12月Epic宣布推出Epic游戏商城至今刚好三年,Epic将平台分成定为12%(远低于当时Steam的30%),并且频繁推出各种…

每天一个面试题:四种引用,弱引用防止内存泄漏

每天一个面试题:四种引用四种引用基本介绍实例Demo- 虚引用弱引用防止内存泄漏弱引用Debug分析源码开始全新的学习,沉淀才会有产出,一步一脚印! 面试题系列搞起来,这个专栏并非单纯的八股文,我会在技术底层…

ZStack出品|制造业专属的VMware迁移方案长啥样?

导读:在国家大力推动信息技术自主化的背景下,制造业也在积极寻找自身信息化改革的路线。作为信息化技术的基石,虚拟化基础架构替换迫在眉睫。本文将从技术层面详细介绍VMware迁移至 ZStack Cloud 云平台的方案,助力制造业实现“信…

阿里P9整理分享的亿级流量Java高并发与网络编程实战PDF

前言 有人调侃我们说: 程序员不如送外卖。送外卖是搬运食物,自己是搬运代码,都不产出新的东西……透支体力,又消耗健康,可替代性极强,30岁之后就要面临被优化的危险……想跳槽,但是更高的平台…

云原生|kubernetes|使用cri-docker部署基于kubeadm-1.25.4的集群

前言: kubernetes的部署从1.24版本开始后,弃用docker-shim,也就是说部署1.24版本后的集群不能使用docker-ce了。 比较清晰的解决方案有两个,一是使用containerd,这个是一个新的支持cri标准的shim,一个是使…

opencv基础-印度小哥

基础课程 第一章-读取图片、视频和摄像头 Chapter 1 – Read Images Videos and Webcams图片放在程序所在文件夹下的Resources/test.png 1.1 opencv读取一张图片并显示&#xff1a; #include <opencv2/imgcodecs.hpp> #include <opencv2/highgui.hpp> #include …