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

目录

一、界面设计

二、设置成员变量

三、初始化成员变量 

四、初始化对话框

​五、添加控件代码

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

  • 119
    点赞
  • 212
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
小型计算器的源程序,基于MFC. // MyCalrr.cpp : Defines the class behaviors for the application. // #include "stdafx.h" #include "MyCalrr.h" #include "MyCalrrDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMyCalrrApp BEGIN_MESSAGE_MAP(CMyCalrrApp, CWinApp) //{{AFX_MSG_MAP(CMyCalrrApp) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG ON_COMMAND(ID_HELP, CWinApp::OnHelp) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMyCalrrApp construction CMyCalrrApp::CMyCalrrApp() { // TODO: add construction code here, // Place all significant initialization in InitInstance } ///////////////////////////////////////////////////////////////////////////// // The one and only CMyCalrrApp object CMyCalrrApp theApp; ///////////////////////////////////////////////////////////////////////////// // CMyCalrrApp initialization BOOL CMyCalrrApp::InitInstance() { AfxEnableControlContainer(); // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif CMyCalrrDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: Place code here to handle when the dialog is // dismissed with OK } else if (nResponse == IDCANCEL) { // TODO: Place code here to handle when the dialog is // dismissed with Cancel } // Since the dialog has been closed, return FALSE so that we exit the // application, rather than start the application's message pump. return FALSE; }
MFC入门可以通过制作一个简易的计算器来学习。你可以按照以下步骤来设计和实现这个简易计算器。 1. 创建项目:在VS2017的MFC应用程序模板中创建一个新项目。 2. 完成数字按键输入工作:首先,你需要判断是在第一个编辑框还是第三个编辑框输入数字。通过判断运算符(第二个编辑框)是否已经输入来确定。如果运算符未输入,则数字按键输入对第一个编辑框生效;如果运算符已输入,则数字按键输入对第三个编辑框生效。为了简化代码,你可以设置一个输入函数来统一处理数字的输入。 3. 在代码文件中添加输入函数:在项目对话框的代码文件(通常是“项目名Dlg.cpp”)中添加下面的代码来定义数字的输入函数。 ``` void CMFCApplication1Dlg::input(char *a) { GetDlgItemText(IDC_EDIT2, str2); //判断第二个编辑框是否为空 if (str2 == _T("")) //如果为空,则对第一个编辑框进行操作 { str1 = LPCTSTR(a); //将输入的字符串转换为扩展字符串 number1 = _ttof(str1); //将扩展字符串转换为数字 SetDlgItemText(IDC_EDIT1, str1); //更新第一个编辑框 } else //如果不为空,则对第三个编辑框进行操作 { str3 = LPCTSTR(a); number2 = _ttof(str3); SetDlgItemText(IDC_EDIT3, str3); } } ``` 4. 在头文件的class中添加字段:在对话框的头文件(通常是“项目名Dlg.h”)中添加以下字段。这里的程序采用了Unicode编码格式,用于将字符转换为准确的数字。编码格式设置可以在项目的属性中进行。 5. 运行程序:点击F5来运行程序,在前三个编辑框分别输入数字(如“1.2”)、运算符(+、-、*、/)和数字(如“2.3”),然后点击等号,你将在最后一个编辑框中得到计算结果。 这样,你就可以通过制作这个简易计算器来入门MFC编程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [MFC入门(简易计算器)](https://blog.csdn.net/qq_37381642/article/details/104066347)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值