MFC程序设计计算器(附带日历)一、主要目的:本设计将实现一个简单计算器并附带一个日历。其功能参照Windows附件中自带的计算器。这个计算器实现了简单的四则运算功能,还实现了模运算和指数运算,具有简洁的图文外观。它的设计按软件工程的方法进行,系统具有良好的界面、必要的交互让使用人员能快捷简单地进行操作。即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间。另外还附加了一个日历功能让使用者了解当前日期。本程序对人们的生活有一定的帮助。在课程设计中,系统开发平台为WindowsXP,程序设计设计语言采用VisualC++,在程序设计中,采用了面向对象的解决问题的方法。在程序设计中,通过设计、编制、调试一个模拟计算器的程序,加深对语法及语义分析原理的理解,并实现对命令语句的灵活应用。在程序设计中,可以用面向对象程序设计方法解决问题。由于多个函数均需要访问某些数据,这些数据常被设计为全局变量。而在面向对象程序设计中关键是如何将问题域中的实体(即日常所见的概念)抽取出来,作为C++程序中的类,而属性与行为作为类的两类要素通常是必不可少的,甚至还应考虑类必须满足的约束。二、开发工具的介绍1、关于VisualC++VisualC++6.0是Microsoft公司在1998年推出的基于Windows9X和WindowsNT的优秀集成开发环境。该环境为用户提供了良好的可视化编程环境,程序员可以里利用该开发环境轻松地访问C++源代码编辑器,资源编辑器和使用内部调试器,并且可以创建项目文件。VisualC++6.0不仅包括编译器,而且它还包括许多有用组件,通过这些组件的协同工作,可以在VisualC++6.0集成环境中轻松地完成创建源文件,编辑资源,以及对程序的编译,连接和调试等各项工作。VC++6.0是Windows95/98、XP或WindowsNT下的一个应用程序,本身对软硬件没有特殊要求。就是说它对环境的要求与Windows95/98、WindowsNT要求是一致的。硬件要求:一般在586以上的处理器、16MB以上内存、100MB以上的硬盘。软件要求:Windows95/98或WindowsNT3.51以上版本。VC++6.0系统可以在一张CD盘上,也可以在“VisualStudio(VisualC++、VisualFoxpro)”等产品的第一张CD盘上。一般都有一个VC的自动安装程序,也可以执行VC6目录下的setup.exe,在安装包的提示下进行,对初学者可采用“典型安装”方式。在安装好VC6.0系统后,有时根据需要添加或删除某些部件,可插入CD盘重新执行setup.exe安装程序,安装程序会检测当前系统安装VC6的足件,用户单击“添加/删除”按钮后,在“安装维护”对话框中选定要添加的部件或撤消选定要删除的部件。与一般的应用软件一样,有以下两种启动方式:(1)通过“开始”按钮,选择“程序”菜单,然后打开“MicrosoftVisualstudio6.0中文版”子菜单中的“MicrosoftVisualC++6.0中文版”程序。(2)用户也可以使用命令行启动VC。单击“开始”按钮后选择“运行”命令,在“运行”对话框中输入c:\ProgramFiles\MicrosoftVisualStudio\VC98\VC6.exe(按默认盘符和路径安装)即可。2、可行性分析本设计是简单计算器。日常计算机使用中,常常涉及到一些有关计算的问题,一个小型的计算器软件变得非常有用,该校型计算器需要空间资源较少,对电脑其他程序的应用影响较小。它的设计按软件工程的方法进行,系统具有良好的界面、必要的交互功能,醒目美观的软件封面。使用人员能快捷简单地进行操作。即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助。3、需求分析本软件主要用于计算机windows2000/XP以上版本的用户的使用,这次课程设计一般是实现简单计算器的功能。要程序能实现:加,减,乘,除,开方,模运算等运算功能;还要实现数据的输入,输出,计算,显示及程序退出等功能。另外还可以查阅当前日期。三、功能说明它的设计按软件工程的方法进行,系统具有良好的界面;必要的交互信息;简约美观的效果。使用人员能快捷简单地进行操作。即可单击按钮进行操作。即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助。(1)包含的功能有:加、减、乘、除运算,开方、求模等功能.(2)计算器上数字0—9为一个控件数组,加、减、乘、除为一个控件数组,其余为单一的控件。(3)输入的原始数据和结果都显示在窗口顶部的同一个标签中。(4)计算功能基本上是用公式计算方法实现。(5)程序可以能自动判断输出数据的正确性,保证不出现结果中以0开头等不正常现象。(6)“C”按钮可以清除所有已输入的数据从头计算。功能模块的实现:基于dialog类添加Caculator类,在这个类中实现高级的按钮控件。在此类中对于所有的对于按钮的绘制工作都是在对话框资源管理中完成的,实现按钮对鼠标单击动作执行不同的计算,在UpdateData(false)函数后显示文本。四、系统的实现1、窗体设计利用MFCAppWinzard生成计算器应用程序框架具体步骤如下:(1)执行VC程序,选择File|New命令,弹出New对话框.单击Projects标签,转到Projects选项卡,选择MFCAppWizard(exe)选项,然后在Projectname文本框中输入Calculator。(2)单击OK按钮,弹出MFCAppWinzard_Step1对话框。选中单选按钮。(3)单击Next按钮,弹出MFCAppWinzard_Step2of4对话框。(4)单击Next按钮,弹出MFCAppWinzard_Step3of4对话框。(5)单击Next按钮,弹出MFCAppWinzard_Step4of4对话框。单击Finish按钮,创建框架。2、编辑资源(1)编辑对话框及控件资源利用VisualC++提供的资源编辑器对对话框资源进行编辑。删除对话框中默认的OK和Cancel按钮。添加一个Edit控件,其控件ID为IDC_EDIT1。添加若干按钮控件,其ID如表4-1所示。表按钮控件资源清单按钮名称按钮ID用途0IDC_0按键01IDC_1按键12IDC_2按键23IDC_3按键34IDC_4按键45IDC_5按键56IDC_6按键67IDC_7按键78IDC_8按键89IDC_9按键9。IDC_Dot小数点=IDC_Equal求值+IDC_Add加号-IDC_Subtract减号*IDC_Mutiply乘号/IDC_Devide除号CEIDC_Clear清屏SqrtIDC_Sqrt开方%IDC_Spare倒数x^yIDC_Power以X为底的y次幂添加一个日历控件,截图如下:添加3个静态框,将日历控件,计算器分别分组。其效果如图4-1所示。图编辑对话框资源3、实现对话框控件类利用ClassWizard添加一个新类,如图所示。图添加CAdvButton类(1)添加成员变量和成员函数为实现按钮控件对鼠标的单击作出相应的响应。首先添加成员变量:public:char*signedbuffer;//定义数字符号存储器unsignedinti;//供for循环使用的全局变量charoperator1,*str1,*str2,*buffer;//定义操作符存放变量和用来暂存输入值和小数位数CStrings1,s2;//用来暂存将输入的字符转换成的intsign;intdecimal;doublem_X;//存放操作数1doublem_Y;//存放操作数2doublem_Result;//输出结果利用ClassWizard添加消息映射和响应函数:图添加响应函数4、实现高级编辑控件类利用ClassWizard添加一个新类,如图所示.图添加CAdvEdit(1)添加成员变量和成员函数为CCaculator类添加一个字符串类型的成员变量m_IDC_EDIT1_TEXT,用来记录编辑框中的文本内容。其实现代码如下:图添加成员变量5、对话框界面设计对主对话框添加成员变量和函数。主要成员函数://CCalculatorDlg.h头文件//DialogData//{{AFX_DATA(CAboutDlg)enum{IDD=IDD_ABOUTBOX};//}}AFX_DATA//建立与资源中的对话框窗口确立联系//{{AFX_VIRTUAL(CCalculatorDlg)Protected:virtualvoidDoDataExchange(CDataExchange*pDX);//数据交换函数//}}AFX_VIRTUAL添加消息响应函数:图按钮响应消息除以上主要成员是为每个按钮控件建立一个成员函数来响应其EN_CLICKED消息。如图4-12所示:图为按钮控件添加消息响应(2)关联控件与对象在CCalculatorDlg类的声明中,已经为编辑框、静态框及每一个按钮声明了相应类型的对象与之对应。图关联控件与对象6、数值计算功能的实现具体功能的实现首先添加成员变量。该计算器中所有的运算都是二元运算,即需要两个操作数,一个二元运算操作符。所以必须声明两个浮点数,分别用来表示初始操作数和结果操作数,同时,必须声明两个字符串类型的变量,分别用来显示初始操作数。还需要一个整形变量来记录当前运算符,以及一个整形变量来记录当前小数点按钮是否被单击过。实现代码如下://CCalculatorDlg.h头文件public:char*signedbuffer;//定义数字符号存储器unsignedinti;//供for循环使用的全局变量charoperator1,*str1,*str2,*buffer;//定义操作符存放变量和用来暂存输入值和小数位数CStrings1,s2;//用来暂存将输入的字符转换成的intsign;//标志数字正负intdecimal;//表示小数点位置doublem_X;//存放操作数1doublem_Y;//存放操作数2doublem_Result;//输出结果1).在单击数字键及小数点建时执行代码内容是将所单击字符加入到m_IDC_EDIT1_TEXT变量的最后一位并更新显示文本,这里以数字键1为例:voidCCaculatorDlg::On1(){m_IDC_EDIT1_TEXT=m_IDC_EDIT1_TEXT+1;UpdateData(false);}2).在单击操作符键的时候执行代码内容是将显示文本的变量m_IDC_EDIT1_TEXT赋值给s1存放作为操作数1,然后将变量m_IDC_EDIT1_TEXT清零,然后将符号赋值给operator1变量,最后更新显示文本。以加号为例:voidCCaculatorDlg::OnAdd(){s1=m_IDC_EDIT1_TEXT;m_IDC_EDIT1_TEXT=;operator1='+';UpdateData(false);}3).在单击C键即清除键时执行代码为:voidCCaculatorDlg::OnClear(){m_IDC_EDIT1_TEXT=;m_X=0.0;m_Y=0.0;m_Result=0.0;UpdateData(false);}即是将所有数据还原成默认值以准备进行下一次运算。4).在单击“=”键时执行的代码是:voidCCaculatorDlg::OnEqual(){m_X=strtod(s1,&str1);//将两个操作数分别转换类型并存入m_X和m_Ym_Y=strtod(m_IDC_EDIT1_TEXT,&str2);switch(operator1){case'+':m_Result=m_X+m_Y;break;case'-':m_Result=m_X-m_Y;break;case'*':m_Result=m_X*m_Y;break;case'/':m_Result=m_X/m_Y;break;c