VC++环境下计算器程序设计与实现
设计目标:在VC++环境下可视化编程实现简单计算器的实现。目标是有数字按钮,加减乘除符号按钮,清除按钮,两个输入框用来输入用算数字,一个输出框用来显示输出结果。 设计过程:
第一步 页面设计部分与控件添加部分
首先打开VC,选择MFC AppWizard[exe],设定好路径和工程名(这里我设置工程名为为“计算器”)。在创建向导步骤1的时候,选择“基本对话框”。创建完成后,把当前页面上原配的控件按Delete全部清除,接着按照MFC自带的控件选项进行本次计算器的控件添加,在原先清空的界面中依次用控件工具框中的相应工具,画出基本的计算器界面(如下图)。
每个控件“属性”都有属于它自己的ID,默认的按钮按键为IDC_BUTTON0,对控件数字按钮和符号按钮的ID不进行修改,把按钮的标题改成相应的数字和运算符号。编辑框的ID选择默认ID不做修改, 完成修改后,就需给控件添加消息响应了,基本操作可以是直接双击控件,便会有向导提示。MFC默认下了的响应信息都为On_开头,这个步骤一般不对成员函数名称做任何修改,直接点击OK即可。
之后就会跳转到具体的代码实现过程,这里我们依次给每一个控件添加消息响应函数:
void CMyDlg::OnButton1() { }
void CMyDlg::OnButton3() { }
// TODO: Add your control notification handler code here // TODO: Add your control notification handler code here
其他的控件和上面的类似。
到此为止,基本上完成了计算器页面的前半部分预备工作,下来是对控件具体实现代码的添加。在开始第二步之前有一项工作时必须要做的,那便是添加3个成员变量和一个CEdit类的变量。
具体添加方法,就是右键主对话框CMyDlg,选择Add Member Variable。也可以是在菜单栏中选择“查看”,“建立类向导”如下图所示。这里把3个编辑框控件内的变量都改变为double型。之后再在控件IDC_EDIT3中选择\"Add Variable\并且数据类型选择 Control类型,此时变量自动改为了CEdit类,这步的意思是把编辑框控件3设置为CEdit类,并且设置一个成员对象是m_CResult。
第二步 控件消息响应函数具体代码添加部分
从加法开始,其代码如下:
void CMyDlg::OnButton11() { }
// TODO: Add your control notification handler code here double n_result;
n_result=m_num1+m_num2; m_num3=n_result; char sz[20];
sprintf(sz,\"%f\m_CResult.SetWindowText(sz); UpdateData();
其中UpdateData() 是MFC的窗口函数,用来刷新数据的。 m_CResult.SetWindowText(sz);此句是把结果输出在之前用CEdit类创建的对象m_CResult,m_CResult调用SetWindowText(sz);把结果显示在编辑框中。
剩下的减法 乘法 和除法 也是大同小异(只是把符号改一下)。 由于我预设了2个编辑框所想实现的功能是,如在编辑框1内输入一个输入30,然后再编辑框2内输入另一个数字20,并且再进行运算。问题是,如何用判断用户是在哪个编辑框上输入了数字,所以我需要给程序加入一个功能,那便是判断用户是在编辑框1输入,还是编辑框2内输入。可以加入一个鼠标左键点击WM_LBUTTONDOWN消息和一个EN_SETFOCUS事件来响应这个鼠标消息,
EN_SETFOCUS为判断焦点事件。用户用鼠标选择并点击编辑框的时候,用WM_LBUTTONDOWN消息去响应,然后与此同此,把响应的和EN_SETFOCUS联系起来,预设一个全局变量nEditFlag ,作为在EN_SETFOCUS函数里的一个标记,并在鼠标点下的时候用nEditFlag 去表示编辑框目前被选定的状态,nEditFlag ==1 的时候我们就判断用户选择了编辑框1,再者当nEditFlag ==2的时候说明编辑框2被选定。 如何添加事件EN_SETFOCUS,由于EN_SETFOCUS是一个判断焦点的,所以对象应该是编辑框1和编辑框2里添加,所以我们回到对话框编辑页面。
“右键编辑框1”,点击“事件”,“选择EN_SETFOCUS”(这里程序默认的响应函数是OnsetfocusEdit1)
依次类推也给编辑框2添加事件响应函数OnsetfocusEdit2,方法同上。如下图:
设置好之后,还要做一些初始化工作,在程序运行之初,先初始化nEditFlag = 0;在OnInitDialog()内进行初始化,只需在OnInitDialog()函数中加入一句nEditFlag = 0;就可以了。之后再为两个事件响应函数进行OnsetfocusEdit1()和OnsetfocusEdit2()添加代码如下:
void CMyDlg::OnSetfocusEdit1() { }
void CMyDlg::OnSetfocusEdit2() { }
nEditFlag=2;
// TODO: Add your control notification handler code here
nEditFlag=1;
// TODO: Add your control notification handler code here
当用户选定编辑框1的时候,nEditFlag = 1; 当用户选定编辑框2的时候,nEditFlag = 2; 鼠标消息WM_LBUTTONDOWN具体代码如下
void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default this->SetFocus(); nEditFlag=0; CDialog::OnLButtonDown(nFlags, point); }
第三步 按键0-9的响应部分
由于代码都大同小异,所以就用数字按钮1,2来进行说明
void CMyDlg::OnButton1() {
// TODO: Add your control notification handler code here UpdateData(TRUE); if(nEditFlag==1) { }
else if(nEditFlag==2) {
m_num1=m_num1*10+1;
m_num2=m_num2*10+1;
}
UpdateData(FALSE); }
void CMyDlg::OnButton2() {
// TODO: Add your control notification handler code here UpdateData(TRUE); if(nEditFlag==1) { }
else if(nEditFlag==2) {
m_num1=m_num1*10+2;
m_num2=m_num2*10+2;
}
UpdateData(FALSE); }
用if语句去判断标记常量nEditFlag,从而给判断是m_num1还是m_num2进行操作。 这里
m_num1是编辑框1内的数字 m_num2是编辑框2内的数字
(说明:清除的功能就是计算完成后清除编辑框内的数字,该功能暂时还没有实现。)