基于MFC的简易计算器制作设计.docx
《基于MFC的简易计算器制作设计.docx》由会员分享,可在线阅读,更多相关《基于MFC的简易计算器制作设计.docx(15页珍藏版)》请在冰豆网上搜索。
基于MFC的简易计算器制作设计
《面向对象的VisualC++程序设计》
课程设计报告
学号:
1123101750
姓名:
金鹏举
专业年级:
11测控技术与仪器
河南大学物理与电子学院
测控技术与仪器教研室
基于对话框的计算器MFC方法实现
随着社会的发展,人们在日常生活中经常需要用到计算器来进行简单或者复杂的运算,计算器在人们生活中的地位也越来越重要。
简单的计算器能实现加、减、乘、除、开方、平方等运算。
学习了C++的程序设计语言这门课程,可以利用基于VC的MFC方法制作一个简易的计算器,实现基本的运算功能,从而满足生活中的需要,降低计算的难度。
一.面向对象的程序设计方法
区别与面向过程的“先功能后数据”思想,面向对象的程序设计方法把状态(数据)和行为(功能)捆绑在一起,形成了对象。
当遇到一个具体的问题时,我们只需要将一个系统分解成一个个的对象,同时将状态和行为封装在对象中。
面向对象的程序设计方法具有三个基本特点:
封装、继承和多态。
(1) 封装性
封装是一个用来指代将对象的状态和行为捆绑到一个单一逻辑单元的机制的正式术语。
它不是面向对象语言所特有的,面向过程的C语言用结构封装了数据,函数封装了逻辑。
但是面向对象封装了两者,从这种意义上来说,面向对象的封装更加完美。
出于一些安全性与方便性的考虑,对象经常会限制对它们特征(包括属性和方法)的访问,这种限制称为信息隐藏。
作为对象的抽象,类通常只公开对象可以公开的东西,主要是一个特定对象对系统的服务,而隐藏执行服务的内部细节和为了完成这些服务而设计的数据。
( 2) 继承性
继承是定义新类的一种机制,使用这种机制创建新类时只需要声明新类和已创建类之间的差别。
对于一个特定的继承关系,我们将创建的新类称为子类(subclass),被继承的原始类称为超类(superclass)。
子类可以使用超类定义属性和方法,也可以自己定义新的属性和方法。
超类的特征不会受到子类的影响。
继承带来的第一个且是最显而易见的好处是减少了代码冗余,因此也减轻了需要改进或重写代码时的负担。
进一步地,子类会比不使用继承时更加简洁,这点应当不难理解;通过继承可以不加修改地重用和扩展已经彻底测试的代码,这避免了工程性的组装对已经完成测试代码的影响;最好的一点,即使没有已有类的源代码,仍然可以从已有的类中派生出新类,只要我们拥有那个类编译后的字节码。
(3)多态性
术语多态指的是属于两个或多个不同类的对象以各自的类相关的不同方式响应同一消息(方法调用)的能力。
同一个消息根据发送的对象不同而采用多种不同的行为方式。
换句话说多态使得消息发送者能给一组具有公共接口的对象发送相同的消息,接收者做出相应的回应。
多态的作用:
增强了代码的可读性、操作的透明性,增强了代码的灵活性和可扩充性。
二.MFC程序设计方法
(1)API 应用程序编程的接口函数
一个应用程序要和具体的硬件打交道,比如接收按键值,接收鼠标左击或右击,记录鼠标的坐标等,就势必要有所有这些硬件的驱动,这样加大了程序的代码量。
而且,每一个应用程序都得写,增加了不必要的重复工作。
操作系统就是解决这些问题的。
操作系统基于硬件和应用程序之间,它提供应用程序调用的函数,应用程序可通过这些函数与硬件打交道。
而这些函数就是API。
(2)MFC(Microsoft Foundation Class)微软基础类库
MFC类库集成了大量已经预先定义好的类,用户可以根据编程的需要调用响应的类,或根据需要自定义有关的类。
(3)窗口
就是一个应用程序能够看到的部分。
是Windows应用程序中一个非常重要的元素。
通常都包含标题栏、菜单栏、系统菜单等
(4)消息和消息队列
消息 :
应用程序接收的事件都会产生相应的消息,消息的产生是因为事件发生的结果。
如键盘有键盘按下和抬起消息,鼠标有点击消息,画面有刷新消息,重画消息等。
编写应用程序时,如果需要对某事件进行响应,如需要当按下Ctrl+S组合键就进行保存操作时,就需要对Ctrl+S这个事件对应的消息设计响应函数。
消息队列 :
应用程序对事件消息进行的响应时从它本身的消息队列里取出消息来执行的。
事件是有操作系统接收的,然后把它转化成消息,再把消息送到应用程序所在的队列中,供应用程序取走。
(5)事件驱动
Windows应用程序函数执行过程没有一个固定的顺序。
一条消息过来就对应进行响应(只要设计了响应函数),那条消息来就执行那条对应的函数,没有消息就等待。
MFC程序设计的好处:
一是MFC提供了一个标准化的结构,通过创建时的选择就可以实现一个基本的程序功能。
这样不必从头开始设计创建和管理一个标准Windows应用程序所需的代码,节省了时间;二是它可以自动生成很多代码,比如只要用类向导(ClassWizard)添加了一个成员变量,它就会自动在代码的相应位置添加代码进去,如果手动添加,不光麻烦,而且文件很多,位置不固定可能会遗漏。
所以类向导是经常需要用的,以提高编程效率,减少出错。
MFC编程的主要过程就是编写消息响应函数的过程,因为其他的工作都自动生成了。
因此就需要我们知道如何添加消息响应函数(用类向导),响应函数中写什么内容。
响应函数的内容主要是调用系统函数,类里定义的成员函数,系统的系统函数,以及变量的传递等。
三.MFC实现计算器的程序设计
程序流程图
主要程序代码如下:
//为了能在同一个编辑框里显示完整的算式,我添加了两个编辑框,同时输入,一个负责计算数据的不可见,另一个可见的用来显示。
voidCJncalDlg:
:
OnNUM1()//点击数字键1时显示1
{UpdateData(TRUE);
m_str1=m_str1+"1";/在编辑框1的字符串后加上字符1
m_str2=m_str2+"1";/在编辑框2的字符串后加上字符1
UpdateData(FALSE);}
voidCJncalDlg:
:
OnNUM2()//按下数字键2时显示数字2
{UpdateData(TRUE);
m_str1=m_str1+"2";//在编辑框1的字符串后加上字符2
m_str2=m_str2+"2";//在编辑框2的字符串后加上字符2
UpdateData(FALSE);}
voidCJncalDlg:
:
OnNUM3()//按下数字键3时显示数字3
{UpdateData(TRUE);
m_str1=m_str1+"3";//在编辑框1的字符串后加上字符3
m_str2=m_str2+"3";//在编辑框2的字符串后加上字符3
UpdateData(FALSE);}
数字键4、5、6、7、8、9、0、00的代码同上
voidCJncalDlg:
:
OnSUB()//加法
{UpdateData(TRUE);
m_str2=m_str2+"+";//显示框上显示“+”
UpdateData(FALSE);
SaveValue1();//调用函数将第一个操作数变为double型并保存
m_Sign=0;//选择语句的条件赋值}
voidCJncalDlg:
:
OnDEC()//减法
{UpdateData(TRUE);
m_str2=m_str2+"-";//显示框上显示“-”
UpdateData(FALSE);
SaveValue1();//调用函数将第一个操作数变为double型并保存
m_Sign=1;//选择语句的条件赋值}
voidCJncalDlg:
:
OnMUL()
{UpdateData(TRUE);
m_str2=m_str2+"×";//显示框上显示“×”
UpdateData(FALSE);
SaveValue1();//调用函数将第一个操作数变为double型并保存
m_Sign=2;//选择语句的条件赋值}
voidCJncalDlg:
:
OnDIV()//除法
{UpdateData(TRUE);
m_str2=m_str2+"÷";//显示框上显示“÷”
UpdateData(FALSE);
SaveValue1();//调用函数将第一个操作数变为double型并保存
m_Sign=3;//选择语句的条件赋值}
voidCJncalDlg:
:
OnEQUAL()//“=”操作
{Calculator();//调用Calculator函数}
voidCJncalDlg:
:
SaveValue1()//保存第一个操作数函数
{UpdateData(TRUE);
m_num1=atof(m_str1);//第一个编辑框内的字符转换为数字并赋给m_fNumber1
m_str1="";//清空第一个编辑框
UpdateData(FALSE);}
voidCJncalDlg:
:
Calculator()//Calculator函数
{UpdateData(TRUE);
m_num2=atof(m_str1);//编辑框1内的字符转换成数字并赋值给m_fNumber2
doubler=0.0f;
switch(m_Sign)//选择语句
{case0:
//加
f=m_num1+m_num2;
break;
case1:
//减
f=m_num1-m_num2;
break;
case2:
//乘
f=m_num1*m_num2;
break;
case3:
//除
if(m_num2==0.0f)
{MessageBox("输入错误,请重新输入");}
else
{f=m_numn1/m_num2;}
break;
case4:
//平方
f=m_num2*m_num2;
break;
case5:
//开方
f=sqrt(m_num2);
break;
default:
break;}
if(r-int(r)<=1e-5)//如果浮点数其实是个整数
{m_str1.Format("%d",(int)f);
m_str2=m_str2+"="+m_str1+"";}
else
{m_str1.Format("%f",f);
m_str2=m_str2+"="+m_str1+"";}
UpdateData(FALSE);
m_num1=r;
m_num2=0.0f;}
voidCJncalDlg:
:
OnABOUT()//软件关于按钮
{CAboutDlgdlg;
dlg.DoModal();//调用}
voidCJncalDlg:
:
OnCE()//清空编辑框操作
{UpdateData(TRUE);
m_str1="";//第一个编辑框赋空值
m_str2="";//第二个编辑框赋空值
m_num1=0.0f;//第一个操作数赋0
m_num2=0.0f;//第二个操作数赋0
m_Sign=0;
UpdateData(FALSE);}
voidCJncalDlg:
:
OnDEL()//退格操作
{UpdateData(TRUE);
if(!
m_str1.IsEmpty())//移除编辑框内最右边一个字符
{m_str1=m_str1.Left(m_str1.GetLength()-1);
m_str2=m_str2.Left(m_str2.GetLength()-1);}
UpdateData(FALSE);}
//以下为显示当前时间操作
intCJncalDlg:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{if(CDialog:
:
OnCreate(lpCreateStruct)==-1)
return-1;
SetTimer(1,1000,NULL);//设置定时器
return0;}
voidCJncalDlg:
:
OnTimer(UINTnIDEvent)
{SYSTEMTIMEst;
GetLocalTime(&st);
CStringstr_time;
str_time.Format("%d:
%d:
%d",st.wHour,st.wMinute,st.wSecond);
SetDlgItemText(IDC_STATICTIME,str_time);
CDialog:
:
OnTimer(nIDEvent);}
四、试验结果展示
计算器的整体效果图。
我在计算器的顶端加入了显示当前日期和时间的功能,更加方便快捷。
加法功能的实现
减法功能的实现
乘法功能的实现
除法功能的实现
本计算器除了能实现加减乘除运算,还能进行平方(x^2)和开方(sqrt)的运算。
以下为开方演示
。
关于计算器
经过后续改进,我又再计算器中加入了音乐播放功能,能够边听音乐边计算。
截图及程序代码如下:
voidCJncalDlg:
:
OnMUSIC1()//播放音乐1
{PlaySound("F:
//1.wav",NULL,SND_FILENAME|SND_ASYNC);
}
voidCJncalDlg:
:
OnMUSICOFF()//关闭音乐
{
//TODO:
Addyourcontrolnotificationhandlercodehere
PlaySound(NULL,NULL,SND_ASYNC);
}
voidCJncalDlg:
:
OnMUSICCHANGE()//播放音乐2
{//TODO:
Addyourcontrolnotificationhandlercodehere
PlaySound("F:
//1.wav",NULL,SND_FILENAME|SND_ASYNC);
}
五、总结
本次计算器的制作是在查阅了大量参考文献借鉴了许多前辈们的制作基础上独立完成的。
控件的添加,代码的编写都是耗费大量时间和精力才成功的。
计算器已经实现了其基本功能,可以进行整数和小数的加减乘除、平方、开方运算,与其他计算器不同的是我所制作的计算器能够完整的显示运算式,这样能够清楚的看到自己所做的运算,更加方便,能够及时找出错误,并且我还在计算器的顶端设计了当天日期和当前时间,更加符合人们的生活需要。
计算器的图标也是我自己绘制的具有独特风格的JN字样,显得美观大方。
计算器虽然已经基本实现其功能,但是由于作者水平所限,并不能打到十全十美的程度,还有许多功能可以添加和完善,例如sin、cos、tan、log等运算。
计算器让我不满意的一点是只能通过设定的按键进行输入,不能通过键盘输入,后来经过改进,键盘输入也只能输入第一个操作数,这是此计算器瑕疵的地方,有待改进和提高。
欢迎提供意见和指导。
参考文献
[1]宋金珂编著,VC++程序设计基础教程,清华大学出版社
[2]谭浩强.《c语言程序设计》.清华大学出版社
[3]辛长安编著.VC++编程技术与难点剖析.清华大学出版社
[4]陈恭和编著.数据库Access2002应用教程.清华大学出版社
[5]王瑞编著.VisualC++数据库系统开发完全手册.人民邮电出版社
[6]王春才编著.VisualBasic数据库系统开发完全手册.人民邮电出版社
[7]高春艳.VisualBasic数据库系统开发案例精选.人民邮电出版社
[8]李晓黎编著.VisualBasic+SQLServer数据库应用系统开发与实例.人民邮电出版社
[9]启明工作室编著.VisualBasic+Access数据库应用系统开发与实例.人民邮电出版社
[10]启明工作室编著.VisualC+++SQLServer数据库应用系统开发与实例.人民邮电出版社
[11]吕军编著《VisualC++与面向对象程序设计教程》第二版.高等教育出版社