STEP 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()
{
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()
{
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()
{
}
void CMyDlg::OnButton3()
{
}
void CMyDlg::OnButton4()
{
}
这里我告诉大家如何添加 事件 EN_SETFOCUS,由于EN_SETFOCUS是一个判断焦点的,所以对象应该是编辑框1和编辑框2里添加,所以我们回到对话框编辑页面 。
“右键编辑框1”->点击“事件”-> “选择EN_SETFOCUS”(这里程序默认的响应函数是OnsetfocusEdit1)
依次类推我们也给编辑框2添加事件响应函数OnsetfocusEdit2,方法同上
如下图
我们只需在OnInitDialog()函数中 加入一句
nEditFlag = 0;便可以了(如下图黑条字体部分)
之后我们再为两个事件响应函数进行OnsetfocusEdit1()和OnsetfocusEdit2()添加代码
当用户选定编辑框2的时候,nEditFlag = 2;
而鼠标消息WM_LBUTTONDOWN具体代码如下
//
STEP 3(按键0~9的响应部分)
这里由于代码都大同小异 ,所以就用数字按钮1,2来进行简要说明
这里
m_num1是编辑框1内的数字
m_num2是编辑框2内的数字
剩下了3~9代码以上大同小异。
这里进行一个说明
比方说 用户想打出自然数“234”
用户第一次点的数字是2 那么此时对应代码执行是这段
之后如果在点击3的时候执行的代码是
最后点击4 执行的代码是
m_num2=m_num2*10+4;(23*10 +4=234)
通过以上小例子 大家明白了吧~ 为什么要 “先乘以10 再加 数字”
) 。最大的障碍就是唯独是那个EN_SETFOCUS这个函数的空白了。我只单存的百度到GetFocus()能获得焦点,但是其实问题远远并没有那么简单,涉及到很多问题。
我当初设置判断的时候还不知道用一个EN_SETFOCUS,并且初始化标记这个方法,过后才知道。我把之前的错误帖一下 顺便是当作是一个警告
void CMyDlg::OnButton14Num0()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if( GetDlgItem(IDC_EDIT1)->GetFocus())
{
}
else if( GetDlgItem(IDC_EDIT2)->GetFocus())
{
m_num2=m_num2*10+0;
}
UpdateData(FALSE);
}
//
分析
GetDlgItem()如果大家不熟悉的话 我可以先解释一下是获得编辑框
首先GetDlgItem(IDC_EDIT1)获取了ID为IDC_EDIT1也就是编辑框CEdit类的对象的指针,继承了CWnd类
函数GetFocus是CWnd中的静态函数,来看一下函数原型:static CWnd* PASCAL GetFocus( );