【基于VS2010的MFC编程】四则运算计算器

【基于VS2010的MFC编程】四则运算计算器

平台/工具:VS2010 
目的:利用VS2010平台创建一个MFC工程,实现四则运算计算器的程序编写和界面设计 
项目分析:实现 “+”“-”“”“/” 四则运算,需要几个要素:运算符“+”“-”“”“/”、数字0~9,用于显示参与运算的两个数的编辑框、用于显示运算结果的编辑框、一些辅助功能按钮。基于这些要素分析,采用VS2010创建一个基于对话框的MFC工程,并在对话框中添加相应的控件,添加一定的消息响应函数及编写实现程序,从而编出一个带有简要说明的能进行四则运算的计算器。 
方法步骤: 
Step 1:创建一个名为“Calculator_MFCBased”的基于对话框的MFC项目,方法之前在“简易加法器”总结中已经讲过,此处不再赘述。

Step 2:建好基于对话框的MFC项目后,会看到Calculator_MFCBased主对话框界面,删除对话框原有的“TODO:在此放置对话框控件”以及“确定”“取消”按钮,在对话框任意空白处单击右键->属性,将右侧出现的属性栏中Caption属性改为“四则运算计算器”,则看到对话框名称变为“四则运算计算器”。重新自定义、设计对话框。

添加控件: 
(1)从工具栏将Static Text工具拖到对话框的适当位置,添加四个静态文本框(Static Text),依次选中->右键->属性,将Caption属性依次改为“欢迎使用软件”“请在以下编辑框中分别输入数字:”“运算结果”“运算符”,ID不改 
(2)从工具栏将Edit Control工具拖到对话框的适当位置,添加三个编辑框(Edit Control),ID分别为IDC_EDIT1、IDC_EDIT2、IDC_EDIT3 
(3)从工具栏将Button工具拖到对话框的适当位置,添加0~9这十个数字,将Caption属性分别改为数字0~9,ID分别改为IDC_NUM_0、IDC_NUM_1、…IDC_NUM_9;继续添加按钮到对话框中适当位置,Caption属性分别改为“+”“-”“*”“/”,对应ID分别为IDC_ADD、IDC_DEC、IDC_multiplication、IDC_division 
(4)添加辅助按钮到对话框:再添加三个按钮到对话框中相应位置,Caption属性分别为“关于软件”“清零”“退出”,ID分别为:IDC_ABOUT_BUTTON、IDC_CLEAR_BUTTON、IDC_QUIT_BUTTON。三个按钮分别实现如下功能:当按下“关于软件”按钮时,跳出关于该四则运算计算器的说明;当按下“清零”按钮时,将对应编辑框中数字清零,实现重新输入功能;当按下“退出”按钮时退出对话框,结束程序。

设置控件: 
将该有的控件添加到对话框完毕后,开始对三个编辑框控件添加变量,方法是: 
选中编辑框->右键->添加变量->在“添加成员变量向导”对话框中勾选“控件变量”,类别均为Value(因为编辑框是用来显示值的),变量类型均为double,变量名分别为m_num1(ID为IDC_EDIT1的编辑框,位于主对话框左侧第一个位置,用于显示参与运算的第一个数值)、m_num2(ID为IDC_EDIT2的编辑框,位于上一个编辑框之下,用于显示参与运算的第二个数值)、m_result(ID为IDC_EDIT3的编辑框,用于显示运算结果)

Step 3: 控件消息响应函数具体代码添加部分 
在主对话框中双击“+”“-”“*”“/”,则跳转进入主程序Calculator_MFCBasedDlg.cpp中这些控件的消息响应函数处,在其函数体中添加实现对应功能的代码,具体如下: 
void CCalculator_MFCBasedDlg::OnBnClickedAdd() //“加” 

// TODO: 在此添加控件通知处理程序代码 
UpdateData(TRUE); //将各种控件中的数据保存到相应的变量 
m_result=m_num1 + m_num2; //做加法 
UpdateData(FALSE); //根据各变量的值更新相应的控件,计算结果编辑框会显示m_result的值 
}

void CCalculator_MFCBasedDlg::OnBnClickedDec() //“减” 

// TODO: 在此添加控件通知处理程序代码 
UpdateData(TRUE); //将各种控件中的数据保存到相应的变量 
m_result=m_num1 - m_num2; //做减法 
UpdateData(FALSE); //根据各变量的值更新相应的控件,计算结果编辑框会显示m_result的值 
}

void CCalculator_MFCBasedDlg::OnBnClickedmultiplication() //“乘” 

// TODO: 在此添加控件通知处理程序代码 
UpdateData(TRUE); //将各种控件中的数据保存到相应的变量 
m_result=m_num1*m_num2; //做乘法 
UpdateData(FALSE); //根据各变量的值更新相应的控件,计算结果编辑框会显示m_result的值 
}

void CCalculator_MFCBasedDlg::OnBnClickeddivision() //“除” 

// TODO: 在此添加控件通知处理程序代码 
UpdateData(TRUE); //将各种控件中的数据保存到相应的变量 
m_result=m_num1/m_num2; //做除法 
UpdateData(FALSE); //根据各变量的值更新相应的控件,计算结果编辑框会显示m_result的值 
}

注意:由于有两个运算数,对应两个供显示的编辑框,那么如何判断在哪个编辑框中进行了操作?解决方案是给程序加入一个判断功能,具体思想是:通过鼠标左键点击编辑框,从而判断当前选择的是该编辑框,为此,加入一个鼠标左键点击WM_LBUTTONDOWN消息和一个EN_SETFOCUS事件来响应这个鼠标消息。EN_SETFOCUS为判断焦点事件(通俗来说就是判断光标在什么地方),这样一来,作用过程就比较明晰了:当用户用鼠标选择并点击编辑框的时候,我们用WM_LBUTTONDOWN消息去响应,与此同此,把响应的消息和EN_SETFOCUS联系起来,预设一个int型全局变量nEditFlag(在初始化函数BOOL CCalculator_MFCBasedDlg::OnInitDialog()之前定义)作为在EN_SETFOCUS函数里的一个 标记,并在鼠标点下的时候用nEditFlag 去表示编辑框目前被选定的状态,“nEditFlag ==1”表示用户选择了编辑框1,“nEditFlag ==2”说明编辑框2被选定。

如何添加EN_SETFOCUS事件: 
(1) 设置: 
在主对话框中,选择“示例编辑框”->右键->添加事件处理程序->在出来的向导框中“消息类型”选择EN_SETFOCUS,其他一般会默认(如果没有,请按下图修改) ->添加编辑。编辑框1的事件添加如下图所示(编辑框2类似): 
这里写图片描述 
(2)初始化: 
设置好后,需要做一些必要的初始化工作:在程序运行之初,先初始化nEditFlag = 0(在主程序中的初始化函数BOOL CCalculator_MFCBasedDlg::OnInitDialog()中进行),即将“nEditFlag = 0;”写入到该函数的函数体中,如下图: 
这里写图片描述 
(3)添加事件响应函数代码: 
初始化完毕,为两个事件响应函数OnEnSetfocusEdit1()和OnEnSetfocusEdit2()添加代码: 
void CCalculator_MFCBasedDlg::OnEnSetfocusEdit1() //响应第一个编辑框 

// TODO: 在此添加控件通知处理程序代码 
nEditFlag = 1; //添加的代码 
}

void CCalculator_MFCBasedDlg::OnEnSetfocusEdit2() //响应第二个编辑框 

// TODO: 在此添加控件通知处理程序代码 
nEditFlag = 2; //添加的代码 
}

对于鼠标消息WM_LBUTTONDOWN,做以下操作: 
首先在主程序的消息响应函数中添加“ON_WM_LBUTTONDOWN()”,如下图: 
这里写图片描述 
然后在上述两个事件响应函数之前添加如下代码段: 
void CCalculator_MFCBasedDlg::OnLButtonDown(UINT nFlags,CPoint point) 
//必须在CCalculator_MFCBasedDlg.h头文件的保护成员中声明OnLButtonDown,否则出错 

//TODO:在此添加控件通知处理程序代码 
this->SetFocus(); 
nEditFlag=0; 
CDialog::OnLButtonDown(nFlags,point); 
}

此外需注意:一定要在主程序头文件,即CCalculator_MFCBasedDlg.h中的保护成员(protected)中声明OnLButtonDown(),如下图: 
这里写图片描述

Step 4:(按键0~9的响应部分)(以数字按钮“1”,“0”为例,其他类似) 
void CCalculator_MFCBasedDlg::OnBnClickedNum1() //数字“1”的按钮 

// TODO: 在此添加控件通知处理程序代码 
UpdateData(TRUE); 
if(nEditFlag==1) 

m_num1=m_num1*10+1; 

else if(nEditFlag==2) 

m_num2=m_num2*10+1; 

UpdateData(FALSE); 
}

void CCalculator_MFCBasedDlg::OnBnClickedNum0() //数字“0”的按钮 

// TODO: 在此添加控件通知处理程序代码 
UpdateData(TRUE); 
if(nEditFlag==1) 

m_num1=m_num1*10+0; 

else if(nEditFlag==2) 

m_num2=m_num2*10+0; 

UpdateData(FALSE); 
}

说明: 
(1)if语句判断标记常量 nEditFlag的值, 从而确定是对m_num1(编辑框1内的数字)还是对m_num2(编辑框2内的数字)进行操作; 
(2)“m_num2=m_num2*10+1;”中为何乘以10再加上按钮数字? 
例如,用户想在编辑框2中打出自然数“234”,第一次点的数字是2,那么此时对应执行是这段代码:m_num2=m_num2*10+2;由于初始化时m_num2 = 0,因此m_num2 = 0*10 +2 ,之后如果点击数字3按钮,则执行的代码是: m_num2=m_num2*10+3;此时经过第一步m_num2已经为2了,再点了3,因而结果为m_num2= 2*10+3 = 23,最后点击数字4 按钮,执行的代码是: m_num2=m_num2*10+4;(23*10 +4=234),因此要先乘以10再加上数字按钮对应的数字。

Step 5:功能完善部分 
(1)“清零”按钮: 
我们希望当用户输入的数字不是想要的数字时,能够及时修改,为此,在主对话框中添加 “清零”按钮,当该按钮按下时,将光标当前所在的编辑框中数字清零,用户可以按下数字按钮以重新输入想要的数字。实现方法是:双击“清零”按钮跳转到主程序中该按钮对应的消息响应函数处,在void CCalculator_MFCBasedDlg::OnBnClickedClearButton()函数体中添加如下代码:

UpdateData(TRUE); 
if(nEditFlag==1) //当鼠标左键选中第一个编辑框时,将框中数据清零 

m_num1=0; 

else if(nEditFlag==2) //当鼠标左键选中第一个编辑框时,将框中数据清零 

m_num2=0; 

UpdateData(FALSE); 
(2)“退出”按钮: 
我们希望主对话框中有一个按钮,当按下它时退出整个对话框,结束程序(功能类似于单击对话框中的×),实现方法是:双击“退出”按钮跳转到主程序中该按钮对应的消息响应函数处,在void CCalculator_MFCBasedDlg::OnBnClickedQuitButton()函数体中添加如下代码: 
exit(0); 
(3)“关于软件”按钮: 
我们希望用户单击此按钮时,跳出关于该计算器的一些说明,实现方法有多种,可以是添加属性页的方法,可以是弹出模态对话框的方法,本文采用后者。具体如下: 
① 在“资源视图(Resource View)”中的“Dialog”上点右键选择“插入Dialog (Insert Dialog)”,创建一个新的对话框模板,修改其ID为IDD_INSTRUCT_DIALOG,Caption属性改为“关于该计算器的说明”。 
② 在对话框模板上添加5个静态文本框(Static Text)(具体个数按照文字长短而定),Caption依次改为“此计算器能进行四则运算”,“当鼠标选中任一编辑框,单击数字按钮时,编辑框中将显示相应数字”,“当按下任一运算符按钮时,结果编辑框才会显示相应结果”,“当光标处于某一编辑框中时单击“清零”按钮,则框中数据清零”,“单击“退出”按钮,退出软件”,完成后的对话框如下: 
这里写图片描述 
③ 在对话框任一空白处单击右键选择“添加类”,弹出添加类的对话框,设置“类名(Class name)”为CAboutCalculatorDlg,点“完成”。在“解决方案资源管理器 (Solution Explorer)”中可以看到生成了CAboutCalculatorDlg类的头文件AboutCalculatorDlg.h和源文件AboutCalculatorDlg.cpp。 
④ 在Calculator_MFCBasedDlg.cpp中包含CAboutCalculatorDlg的头文件:#include “AboutCalculatorDlg.h”(Calculator_MFCBased为你创建的项目名,不同项目可能不同)。 
⑤ 单击“使用软件”按钮,跳转到该按钮对应的程序,将下面的代码加到函数void CCalculator_MFCBasedDlg::OnBnClickedAboutButton() 的函数体中: 
//————————————————— 
INT_PTR nRes; // 用于保存DoModal函数的返回值 
CTipDlg tipDlg; // 构造对话框类CAboutCalculatorDlg类的实例 
nRes = tipDlg.DoModal(); // 弹出对话框 
if (IDCANCEL == nRes) // 判断对话框退出后返回值是否为IDCANCEL,如果是则return,否则继续向下执行 
return; 
//————————————————–

至此,整个计算器编写设计完成。运行程序,效果如下(编辑框1中输入14,编辑框2中输入70,做乘法): 
这里写图片描述 
这里写图片描述

  • 6
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值