VS下计算器的MFC编程实现.docx
《VS下计算器的MFC编程实现.docx》由会员分享,可在线阅读,更多相关《VS下计算器的MFC编程实现.docx(18页珍藏版)》请在冰豆网上搜索。
VS下计算器的MFC编程实现
VS2008下计算器的MFC编程实现
简单的计算器编程,完全在VS2008下实现,主要用于熟悉VS2008的功能。
谨以此分享给和我一样初学MFC的朋友们。
STEP1:
页面设计
1.新建工程
首先打开VisualStudio2008,选择MFC应用程序,设定好路径和工程名(这里我设置工程名为为“Calculator”)。
这里要注意的是在创建向导步骤1的时候,我们选择“基本对话框”,其他选项默认即可。
之后我们可以点击完成便看到以下界面:
此时我们把当前页面上原配的控件按Delete全部清除(如下图)
2.添加控件
接着我们按照MFC自带的控件选项进行我们本次计算器的控件添加。
点击右侧的工具栏按钮
(以下是控件)
我们在原先清空的界面中依次用上图控件画出一个基本的计算器页面(如下图)。
当然作为“所见即所得”的MFC控件设计,干净整齐的界面是基本要求,甚至会影响用户的心情。
3.修改空间ID和Caption
上图各控件类型如下:
GroupBox:
选择其中一个GroupBox,右键单击,选择[属性]。
在右边显示属性对话框。
每个控件“属性”都有属于它自己的ID,默认的GroupBox的ID为IDC_STATIC,而且Cap当然我们为了“顾名思义”,对控件ID进行修改成我们容易辨认的(也可以不改),添加完控件并修改ID。
4个GroupBox的ID分别修改为IDC_STATIC_FRAME,IDC_STATIC_IN,IDC_STATIC_RESULT,IDC_STATIC_BUTTON
控件EditControl和Button也按相同的办法处理。
ID设置完成可以在“Resourse.h”中查看。
完成修改ID后,就需给控件添加消息响应了。
在属性对话框的上方点击闪电“
”图标,添加控件事件。
如对于按钮“
”,点击“
”
点击下拉键头,添加控件事件,页面自动切换到代码的编辑页面,如“添加OnBnClickedButton5”
MFC默认下了的响应信息都为On_开头。
到此为止我们基本上完成了计算器页面的前半部分预备工作,接下来是我们的对控件具体实现代码的添加
这里我把添加的控件消息响应函数列出来。
点击左侧栏的“类试图”(或者选择菜单项“视图(V)”——“类试图”)
4.添加成员变量
在开始第二步之前有一项工作时必须要做的,那便是添加3个成员变量和一个CEdit类的变量
具体添加方法:
右键“类视图”中的类“CMyDlg”,选择“添加变量”。
也可以是在菜单栏中选择“项目”——>“添加变量”。
在添加变量向导(如下图)中
勾选“控件变量”,“控件ID”选择“IDC_EDIT1”,“类别”选择“Value”,“变量类型”选择“double”,变量名“m_num1”,点击“完成”,添加成功。
然后依次为另外两个编辑框添加变量“m_num2”“m_num3”。
这里我们把3个编辑框控件内的变量都改变为double型的(因为进行四则运算难免出现小数点)。
之后再在控件IDC_EDIT3中“类别”选择“Control”类型此时变量自动改为了CEdit类,这步的意思是说我们把编辑框控件3的设置为CEdit类并且设置一个成员对象是m_CResult。
STEP2:
控件消息响应函数具体代码添加部分
1.四则运算符
首先从加法开始
voidCCalculatorDlg:
:
OnBnClickedButton11Add()
{
//TODO:
在此添加控件通知处理程序代码
UpdateData();//刷新数据
doublen_result;
n_result=m_num1+m_num2;
m_result=n_result;//加法的计算过程
charsz[20];
sprintf(sz,"%f",m_result);
m_CResult.SetWindowTextA(sz);//打印输出
}
UpdateData()是MFC的窗口函数,用来刷新数据的
由于我们进行基本运算需要更新数据所以必须添加这个函数。
(可以认为是必须的)
n_result=m_num1+m_num2;
m_result=n_result;
charsz[20];
sprintf(sz,"%f",m_result);
以上代码是进行加法的基本语句,然后数组保存并格式化打印输出。
m_CResult.SetWindowText(sz);此句是把结果输出在之前用CEdit类创建的对象m_CResult,m_CResult调用SetWindowTextA(sz);把结果显示在编辑框中。
剩下的减法乘法和除法也是大同小异(只是把符号小改一下便可~~)
这里贴出所有加减乘除的代码
voidCCalculatorDlg:
:
OnBnClickedButton11Add()
{
//TODO:
在此添加控件通知处理程序代码
UpdateData();//刷新数据
doublen_result;
n_result=m_num1+m_num2;
m_result=n_result;//加法的计算过程
charsz[20];
sprintf(sz,"%f",m_result);
m_CResult.SetWindowTextA(sz);//打印输出
}
voidCCalculatorDlg:
:
OnBnClickedButton12Min()
{
//TODO:
在此添加控件通知处理程序代码
UpdateData();//刷新数据
doublen_result;
n_result=m_num1-m_num2;
m_result=n_result;//减法的计算过程
charsz[20];
sprintf(sz,"%f",m_result);
m_CResult.SetWindowTextA(sz);//打印输出
}
voidCCalculatorDlg:
:
OnBnClickedButton13Mul()
{
//TODO:
在此添加控件通知处理程序代码
UpdateData();//刷新数据
doublen_result;
n_result=m_num1*m_num2;
m_result=n_result;//乘法的计算过程
charsz[20];
sprintf(sz,"%f",m_result);
m_CResult.SetWindowTextA(sz);//打印输出
}
voidCCalculatorDlg:
:
OnBnClickedButton14Div()
{
//TODO:
在此添加控件通知处理程序代码
UpdateData();//刷新数据
doublen_result;
n_result=m_num1/m_num2;
m_result=n_result;///除法的计算过程
charsz[20];
sprintf(sz,"%f",m_result);
m_CResult.SetWindowTextA(sz);//打印输出
}
2.焦点事件
这里我特地说明一下
由于我们预设了2个编辑框所想实现的功能是,如在编辑框1内输入一个输入30,然后再编辑框2内输入另一个数字20,然后点击“+”、“-”、“*”、“/”中任何一个按钮,输出结果。
那么存在一个问题。
就是,如何用判断用户是在哪个编辑框上输入了数字,所以我们需要给程序加入一个功能,判断用户是在编辑框1输入,还是编辑框2内输入。
在日常我们用电脑的过程中,一般都是用鼠标去点击编辑框来进行一系列操作。
那么我可以加入一个鼠标左键点击WM_LBUTTONDOWN消息和一个EN_SETFOCUS事件来响应这个鼠标消息。
EN_SETFOCUS为判断焦点事件(通俗点说,那便是判断光标在什么地方)。
添加WM_LBUTTONDOWN消息
在“类试图”中右键选择类“CCalculatorDlg”,打开“属性”对话框,点击“消息
”
选择“WM_LBUTTONDOWN”,点击下拉箭头,点击“<添加>OnLButtonDown”。
添加EN_SETFOCUS事件
右键“编辑框1”,打开“属性”对话框,点击“控件事件
”,选择“EN_SETFOCUS”(这里程序默认的响应函数是OnEnSetfocusEdit1()),点击添加。
依次类推我们也给编辑框2添加事件响应函数OnEnSetfocusEdit2(),方法同上
这样一来,一切逻辑都理顺了。
我们用户用鼠标选择并点击编辑框的时候,我们用WM_LBUTTONDOWN消息去响应,然后与此同此,我们把响应的和EN_SETFOCUS联系起来,我们预设一个全局变量nEditFlag,作为在EN_SETFOCUS函数里的一个标记。
并在鼠标点下的时候用nEditFlag去表示编辑框目前被选定的状态,nEditFlag==1的时候我们就判断用户选择了编辑框1,再者当nEditFlag==2的时候说明编辑框2被选定。
设置好之后,我们还要做一些初始化工作,在程序运行之初,我们先初始化nEditFlag=0;在CalculatorDlg.cpp文件中OnInitDialog()内进行初始化:
我们只需在OnInitDialog()函数中加入一句
nEditFlag=0;
如下所示:
之后我们再为两个事件响应函数进行OnsetfocusEdit1()和OnsetfocusEdit2()添加代码
当用户选定编辑框1的时候,nEditFlag=1;
当用户选定编辑框2的时候,nEditFlag=2;
而鼠标消息WM_LBUTTONDOWN具体代码如下“
STEP3:
按键0~9的响应部分
这里由于代码都大同小异,所以就用数字按钮1,2来进行简要说明。
剩下了3~9代码以上大同小异。
可能遇到的问题:
问题一:
1、重启VC。
2、打开Resource.h文件看看一看就知道了有些定义重复了可以手动改掉保存编辑器重新加载。
3、关闭解决方案,删除ncb文件重新添加即可。
4、实在不行就手动添加消息处理。
5、查看.h和.cpp文件的属性,有可能是只读的,修改属性后就可以了。
6、把你要添加事件的对话框相应的类文件(*.h和*.cpp)给关了就可以了。
问题2:
VS2008中MFC界面编程Caption中文全是乱码
解决方法:
首先到“资源视图”[ResourceView]中找到对话框的ID号,对其右击选择“属性”[Properties],然后在右边的属性栏中找到“语言”[Language]项,默认是英语(美国),改成中文(中国),OK,问题解决。
问题3:
m_CResult.SetWindowTextW(sz);参数1不能从“constchar[20]”转换为“LPCTSTR”类型
解决方案:
选择菜单栏“项目”->“Calculator属性”,选择“配置属性”->“常规”->“字符集”,选择“使用多字节字符集”。
编程过程中如果反复添加删除同名变量,函数可能会造成一些其他问题,但是通过报错信息可以自己改正