mfc入门程序之简单的计算器

mfc入门程序之简单的计算器

在这里插入图片描述

本文将以一名小白视角来叙述一个mfc应用“计算器”的设计过程,作品实现了加、减、乘、除,鼠标点击按钮输入和键盘输入,功能虽然简单但是这个程序帮助我初步的认识了mfc的“世界观”。(下图是软件界面。)

1.创建一个mfc应用程序;

选择mfc应用程序,给工程取个名
在这里插入图片描述
选择基于对话框,这样看起来会简单一点
在这里插入图片描述

2.布局控件

进入项目后会自动切换到这个界面,这个界面是编辑基础对话框的,计算器应用也是基于这个对话框开发,稍后需要布局我们自己的控件,因此把框中所有的默认控件删掉
在这里插入图片描述

按需布置控件,(注意!!为了美观,在你布局好之前不要双击任何控件)控件在右上角的工具箱里面,直接拖进来就好了,一个一个的拖(因为我还不懂一下子布置很多控件,以后学习了再与大家分享),这里用到的两个编辑框是Edit Control,和19个按钮Button。

在这里插入图片描述

3.数字按钮控件配置

我们单击按钮,右键点属性,会出现属性页,在Caption设置按钮显示的文本,然后Horizontal选择文本位置居中(Center),一个个的把所有按钮做成计算器该有的样子

在这里插入图片描述

依次(Button1到Button19)双击控件按钮和两个编辑框,会在“计算器Dlg.cpp”生成代码 ,到时候控件响应事件就是在这里做的(推荐将除了数字以外的按钮的ID改成英文来区别,如乘法:ButtonMut)

在这里插入图片描述
右键第一个编辑框选择添加变量,添加一个value的CString类型的变量mStr,这个变量绑定了编辑框1,我们就通过操作这个变量来实现按钮响应的可视化,就是说输入哪一个数字都会显示在第一个编辑框内。

在这里插入图片描述

进入计算器Dlg.cpp(你自己的工程叫XXX就是XXXDlg.cpp),为按钮添加响应事件,代码如下。

void C计算器Dlg::OnBnClickedButton9()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);	//刷新应用状态
	mStr=L"1";			//字符前加L是把字符转换成Unicode型,将案件内容显示在编辑框
	UpdateData(FALSE);//这个是和上面配合使用的
}

添加完后就可以调试运行一下了,写程序我们要学会调试,调试的过程中寻求反馈,菜鸟程序员不要一码到底不然很容易对编程失去兴趣。(毛主席说过,越是困难的时候越是要看到光明,大概就是这个意思吧)
你可以直接点击调试的绿色箭头
亦可以点击生成—>生成解决方案编译一下再点击绿色的箭头,因为我用的是vs2010,我的vs他程序运行错误的话会自动运行上一次成功的结果,我得不到错误的反馈,应该有设置解决这一问题,但是我习惯了先编译一下(所以我推荐你们也用这种方法)。
在这里插入图片描述

OK,按钮“1”成功响应事件,将“1”显示在第一个编辑框上,因此我们接下来将其他同类型的按钮也添加响应事件,包括Button
2-Button11如下面代码所示:(建议自己敲

void C计算器Dlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);//刷新应用状态
	mStr=L"1";//字符前加L是把字符转换成Unicode型
	UpdateData(FALSE);
}


void C计算器Dlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);//刷新应用状态
	mStr=L"2";//字符前加L是把字符转换成Unicode型
	UpdateData(FALSE);
}


void C计算器Dlg::OnBnClickedButton3()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);//刷新应用状态
	mStr=L"3";//字符前加L是把字符转换成Unicode型
	UpdateData(FALSE);
}


void C计算器Dlg::OnBnClickedButton4()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);//刷新应用状态
	mStr=L"4";//字符前加L是把字符转换成Unicode型
	UpdateData(FALSE);
}


void C计算器Dlg::OnBnClickedButton5()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);//刷新应用状态
	mStr=L"5";//字符前加L是把字符转换成Unicode型
	UpdateData(FALSE);
}


void C计算器Dlg::OnBnClickedButton6()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);//刷新应用状态
	mStr=L"6";//字符前加L是把字符转换成Unicode型
	UpdateData(FALSE);
}


void C计算器Dlg::OnBnClickedButton7()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);//刷新应用状态
	mStr=L"7";//字符前加L是把字符转换成Unicode型
	UpdateData(FALSE);
}


void C计算器Dlg::OnBnClickedButton8()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);//刷新应用状态
	mStr=L"8";//字符前加L是把字符转换成Unicode型
	UpdateData(FALSE);
}


void C计算器Dlg::OnBnClickedButton9()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);//刷新应用状态
	mStr=L"9";//字符前加L是把字符转换成Unicode型
	UpdateData(FALSE);
}


void C计算器Dlg::OnBnClickedButton10()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);//刷新应用状态
	mStr=L"0";//字符前加L是把字符转换成Unicode型
	UpdateData(FALSE);
}


void C计算器Dlg::OnBnClickedButton11()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);//刷新应用状态
	mStr=L".";//字符前加L是把字符转换成Unicode型
	UpdateData(FALSE);
}

4.算法配置(这个程序的核心)

差点忘了,还有第二个edit,我们需要右键添加变量,给他绑定一个private的vlaue的double的mResult,这个是用来接收结果的,因此第二个编辑框也就是用来显示结果的。
在这里插入图片描述
我们要在"计算器Dlg.h"(XXXDlg.h)里面添加一些变量和函数,代码如下:

/*这两个函数都要在“计算器Dlg.cpp”里面重写*/
	void SaveFirstValue();//这个是用来保存一个输入完成的值的。
	void Calculator();	  //这个是用来实现计算的,
	
private:
	double mNum1;//第一个值
	double mNum2;//第二个值
	int mFlag;	//传递运算符,来触发switch中的事件
	CString mStr;//这个是edit1绑定的值,字符串类型,不用自己手动定义
	double mResult;//这个是edit2绑定的值,double型,不用手动定义


转到“计算器Dlg.cpp”重写上面两个关键函数,在程序末尾写:

void C计算器Dlg::SaveFirstValue ()
{
	UpdateData(TRUE);
	mNum1=_wtof(mStr);       //"_wtof"可以将Cstring转换成d0uble
	mStr=L"";				//L将编码格式转成Unicode
	UpdateData(FALSE);
}


void C计算器Dlg::Calculator ()
{
	
UpdateData(TRUE);
mNum2=_wtof(mStr);
switch(mFlag)       //接收按键传过来的mFlag的值,以此来判断是什么运算符
{
case 1:
	mResult=mNum1+mNum2;
	break;
case 2:
	mResult=mNum1+mNum2;
	break;
case 3:
	mResult=mNum1+mNum2;
	break;
case 4:
	mResult=mNum1+mNum2;
	break;
}
UpdateData(FALSE);
}

```cpp

```cpp

```cpp

同样是在“计算器Dlg.cpp”下一步将添加运算符响应事件,添加在数字按钮后最好:(顺序为等于、加、减、乘、除):

void C计算器Dlg::OnBnClickedButton12()
{
	// TODO: 在此添加控件通知处理程序代码
	Calculator();		//等于号的功能
}

void C计算器Dlg::OnBnClickedButton13()
{
	// TODO: 在此添加控件通知处理程序代码
	SaveFirstValue();
		mFlag=1;		//加法的功能![](https://img-blog.csdnimg.cn/20210310144252389.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1hpYW5MaWFuZ2NoZWVzZQ==,size_16,color_FFFFFF,t_70)

}

void C计算器Dlg::OnBnClickedButton14()
{
	// TODO: 在此添加控件通知处理程序代码
	SaveFirstValue();
		mFlag=2;		//减法的功能
}

void C计算器Dlg::OnBnClickedButton15()
{
	SaveFirstValue();  
		mFlag=3;	//乘法的功能
}

void C计算器Dlg::OnBnClickedButton16()
{
	SaveFirstValue();
		mFlag=4;		//除法的功能
}

好了,在生成编译一下,没有错误就可以运行了,这个时候的计算器已经可以实现四则运算了。

5.添加"清除"、“删除”、“退出”

还是在“计算器Dlg.cpp”


/*清除键,归零键*/
void C计算器Dlg::OnBnClickedButton17()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);
	mStr=L"0";//字符串前+L就是把数据转换成Unicode格式
	mResult=0.0;
	mNum1=0.0f;
	mNum2=0.0f;
	UpdateData(FALSE);

}
/*删除右边一个数字*/
void C计算器Dlg::OnBnClickedButton18()
{
	// TODO: 在此添加控件通知处理程序代码
		UpdateData(TRUE);		//将数据更新到控件
	if(!mStr.IsEmpty ())
	{
	mStr=mStr.Left (mStr.GetLength ()-1);		//减掉右边的一位
	}
	UpdateData(FALSE);			//将数据更新到控件
}
/*退出软件*/
void C计算器Dlg::OnBnClickedButton19()
{
	// TODO: 在此添加控件通知处理程序代码
	exit(0);//大家应该都认识

	
}

6.支持键盘操作

描述:可以通过小键盘来用计算器,按回车键计算结果,按Backspace删除最后一位数字。

右键单击对话框,选择添加“类向导”,选择“虚函数”,选择下面这个函数,双击它,应用。
在这里插入图片描述
然后返回到“计算器Dlg.cpp”找到刚刚添加的类,在里面添加键盘按键响应事件。

BOOL C计算器Dlg::PreTranslateMessage(MSG* pMsg)
{
	// TODO: 在此添加专用代码和/或调用基类
	if(pMsg->message==WM_KEYDOWN)
	{
		if(pMsg->wParam==VK_RETURN)//回车键
		{
			Calculator();
		}
		if(pMsg->wParam==VK_BACK  )//删除键
		{
		    C计算器Dlg::OnBnClickedButton18() ;
			
		}
		if(pMsg->wParam==VK_ADD  )//加法键
		{
		   C计算器Dlg::OnBnClickedButton13();
		  
		}

		if(pMsg->wParam==VK_SUBTRACT  )//减法键
		{
		    C计算器Dlg::OnBnClickedButton14();
			
		}
		if(pMsg->wParam==VK_MULTIPLY  )//乘法键
		{
		    C计算器Dlg::OnBnClickedButton15();
		
		}
		if(pMsg->wParam==VK_DIVIDE )//除法键
		{
		    C计算器Dlg::OnBnClickedButton16();
			
		}

	}
	if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_ESCAPE) return TRUE;//屏蔽esc键
	if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN) return TRUE;//屏蔽回车键,让他不再退出
	else

	return CDialogEx::PreTranslateMessage(pMsg);
}

在属性页将edit1设置成只能输入数字

在这里插入图片描述
将edit2设置成只读

在这里插入图片描述

运行成功!你可以在工程文件的Debug目录下找到“.exe”文件。

这是我第一个完整做出来的mfc应用程序,期间我大部分参考了https://blog.csdn.net/qq_36079638/article/details/83591039这一篇博客写的挺好。
虽然网上大多劝退mfc的,但是入职的公司要求会mfc也没办法呀,建议初学者要有C++基础(虚函数、多态、类和对象、继承封装、this指针需要懂的),如果要买书的话,极力推荐一本我正在看的侯俊杰《深入浅出MFC》
随后我会将工程上传。
这是我的第一篇博客。
祝诸君身体健康工作顺利!

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值