当前位置:文档之家› 手把手教你MFC编程计算器

手把手教你MFC编程计算器

手把手教你MFC编程计算器
手把手教你MFC编程计算器

STEP 1(页面设计部分与控件添加部分)

首先打开VC,选择MFC AppWizard[exe],设定好路径和工程名(这里我设置工程名为为“My”)。这里要注意的是在创建向导步骤1的时候,我们选择“基本对话

框”。

之后我们可以点击完成便看到以下界面

此时我们把当前页面上原配的控件按Delete全部清除(如下图)

接着我们按照MFC自带的控件选项进行我们本次计算器的控件添加(以下是控件)

我们在原先清空的界面中依次用上图控件画出一个基本的计算器页面(如下图)。

当然作为“所见即所得”的MFC控件设计,干净整齐的界面是基本要求,甚至会影响用户的心情。

上图我们用按钮控件添加一共15个按钮,分别是数字“ 0 ~ 9” 以及“+ - * /”。

每个控件“属性”都有属于它自己的ID,默认的按钮按键为IDC_BUTTON0,而且Cap当然我们为了“顾名思义”,对控件ID进行修改成我们容易辨认的(也可以不改),添加完控件并修改ID之后。(如下图)

这里我们把数字按钮0 设置ID为IDC_BUTTON14_NUM0,其他的依次类推

完成修改ID后,就需给控件添加消息响应了,基本操作可以是直接双击控件,便会有向导提示。

MFC默认下了的响应信息都为On_开头,而且以下显示的是数字5的消息响应.之后所有的依次类推,这步骤一般不

对成员函数名称做任何修改,直接点击OK即可

之后就会跳转到具体的代码实现过程这里我们依次给每一个控件添加消息响应函数(以下仅列出一部分)

到此为止我们基本上完成了计算器页面的前半部分预备工作,下来是我们的对控件具体实现代码的添加

这里我把添加的控件消息响应函数列出来

这里忘记了,提醒一点

编辑框控件的ID是

IDC_EDIT1

IDC_EDIT2

IDC_EDIT3

还有加减乘除的控件添加当初没有进行名字的设置

默认为

void CMyDlg::OnButton1()//加

void CMyDlg::OnButton2()//减

void CMyDlg::OnButton3()//乘

void CMyDlg::OnButton4()//除

////////////////////////////////////////////////////

在开始第二步之前有一项工作时必须要做的,那便是添加3个成员变量和一个CEdit类的变量

具体添加方法,就是右键主对话框CMyDlg->Add Member Variable

也可以是在菜单栏中选择

“查看”->“建立类向导”

这里我们把3个编辑框控件内的变量都改变为double型的(因为进行四则运算难免出现小数点)

之后再在控件IDC_EDIT3中选择"Add Variable"

并且数据类型选择 Control类型此时变量自动改为了 CEdit类

这步的意思是说我们把编辑框控件3的设置为CEdit类并且设置一个成员对象是

m_CResult。

////////////////////////////////////////////////////////////////////////// STEP 2(控件消息响应函数具体代码添加部分)

首先从加法开始

void CMyDlg::OnButton1()

{

// TODO: Add your control notification handler code here UpdateData();

double n_result;

n_result = m_num1 + m_num2;

m_result = n_result;

char sz[20];

sprintf(sz,"%f",m_result);

m_CResult.SetWindowText(sz);

}

UpdateData() 是MFC的窗口函数,用来刷新数据的

由于我们进行基本运算需要更新数据所以必须添加这个函数。(可以认为是必须的)

n_result = m_num1 + m_num2;

m_result = n_result;

char sz[20];

sprintf(sz,"%f",m_result);

以上代码是进行加法的基本语句,然后数组保存并格式化打印输出。

m_CResult.SetWindowText(sz);此句是把结果输出在之前用CEdit类创建的对象m_CResult,m_CResult调用SetWindowText(sz);把结果显示在编辑框中。

无独有偶

剩下的减法乘法和除法也是大同小异(只是把符号小改一下便可~~)这里贴出所有加减乘除的代码

void CMyDlg::OnButton1()

{

// TODO: Add your control notification handler code here

UpdateData();

double n_result;

n_result = m_num1 + m_num2;

m_result = n_result;

char sz[20];

sprintf(sz,"%f",m_result);

m_CResult.SetWindowText(sz);

}

void CMyDlg::OnButton2()

{

// TODO: Add your control notification handler code here

UpdateData();

double n_result;

n_result = m_num1 - m_num2;

m_result = n_result;

char sz[20];

sprintf(sz,"%f",m_result);

m_CResult.SetWindowText(sz);

}

void CMyDlg::OnButton3()

{

// TODO: Add your control notification handler code here UpdateData();

double n_result;

n_result = m_num1 * m_num2;

m_result = n_result;

char sz[20];

sprintf(sz,"%f",m_result);

m_CResult.SetWindowText(sz);

}

void CMyDlg::OnButton4()

{

// TODO: Add your control notification handler code here UpdateData();

double n_result;

n_result = m_num1 / m_num2;

m_result = n_result;

char sz[20];

sprintf(sz,"%f",m_result);

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()添加代码

当用户选定编辑框1的时候,nEditFlag = 1;

当用户选定编辑框2的时候,nEditFlag = 2;

而鼠标消息WM_LBUTTONDOWN具体代码如下

//////////////////////////////////////////////////////////////////////////////

STEP 3(按键0~9的响应部分)

这里由于代码都大同小异,所以就用数字按钮1,2来进行简要说明

用if语句去判断标记常量 nEditFlag 从而给判断是m_num1还是m_num2进行操作这里

m_num1是编辑框1内的数字

m_num2是编辑框2内的数字

剩下了3~9代码以上大同小异。

相关主题
文本预览
相关文档 最新文档