手把手教MFC做计算器
- 格式:doc
- 大小:929.50 KB
- 文档页数:20
1.课题概述1.1课题目标和主要内容本次课题以编写基于MFC的简易计算器为例,重点是学习如何使用MFC消息响应机制完成一个windows下的交互式软件。
本实验以visual studio 2008为平台。
1.2系统的主要功能基本功能单击数字键,显示当前数值单击“+”、“-”、“*”、“/”建进行运算单击“=”,显示运算结果单击“C”,清除已有结果扩展功能进行浮点运算进行倒数、开方运算2. 系统设计2.1 系统总体框架2.2 系统详细设计[1] 模块划分图及描述(1)对话框:实现与用户的交互,使用了两类控件:显示框和按钮。
(2)事件驱动函数:处理由鼠标单击响应到程序的问题,主要有映射和消息处理函数组成。
例如:void CCalculatorDlg::OnBnClickedButtonPoint(){m_coff = 0.1 ;}(3)运算函数:实现逻辑运算以及数据交换。
例如:void CCalculatorDlg::OnBnClickedButtonSqrt(){if( m_second==0){ m_first=sqrt(m_first);UpdateDisplay(m_first); }else{ m_second=sqrt(m_second);UpdateDisplay(m_second); }}[2] 类关系图及描述class CCalculatorDlg : public CDialogEx{// 构造public:CCalculatorDlg(CWnd* pParent = NULL); // 标准构造函数//对话框数据enum { IDD = IDD_CALCULATOR_DIALOG };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 实现protected:HICON m_hIcon;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()public:int m_duType; //角度和弧度判断double m_first; //存储一次运算的第一个操作数及一次运算的结果double m_second; //存储一次运算的第二个操作数CString m_operator; //存储运算符double m_coff; //存储小数点的系数权值CString m_display; //编辑框IDC_DISPLAY的关联变量,显示计算结果afx_msg void OnBnClickedHudu();afx_msg void OnBnClickedJiaodu();void UpdateDisplay(double dck);void Calculate(void);void onButtonN(int n);afx_msg void OnBnClickedButton1();afx_msg void OnBnClickedButton2();afx_msg void OnBnClickedButton3();afx_msg void OnBnClickedButton4();afx_msg void OnBnClickedButton5();afx_msg void OnBnClickedButton6();afx_msg void OnBnClickedButton7();afx_msg void OnBnClickedButton8();afx_msg void OnBnClickedButton9();afx_msg void OnBnClickedButton0();afx_msg void OnBnClickedButtonPoint();afx_msg void OnBnClickedButtonSign();afx_msg void OnBnClickedButtonAdd();afx_msg void OnBnClickedButtonMinus();afx_msg void OnBnClickedButtonMutiply();afx_msg void OnBnClickedButtonDiv();afx_msg void OnBnClickedButtonClear();afx_msg void OnBnClickedButtonSqrt();afx_msg void OnBnClickedButtonReci();afx_msg void OnBnClickedButtonEqual(); [3] 程序流程图及描述(2.3 关键算法分析算法1:UpdateDisplay[1] 算法功能:更新显示数据。
课程名称:Visual C++面向对象与可视化程序设计实验项目:计算器设计姓名:专业:计算机科学与技术班级:学号:计算机科学与技术学院实验教学中心2016 年11月19日哈尔滨理工大学计算机科学与技术学院实验报告实验项目名称:计算器设计( 2课时)一、实验目的1.灵活使用MFC应用程序设计2.设计计算器二、实验内容设计一个简单的计算器,可以实现加法,减法,除法,乘法,取模,开平方,输入数字要求可以输入小数,可以连加。
具有清空,回退功能。
三、实验步骤1.启动VS打2012开新建项目2.出现的New对话框的Projects标签内选择MFC应用程序3.Projects Name指定项目的名字,在Location中指定路径后按OK按钮4.选择创建类型,(例如基于对话框),确定项目类型后按Finish完成。
5.编写实验代码四、实验结果五、程序代码// project_1Dlg.h : 头文件//#pragma once#include "afxwin.h"// Cproject_1Dlg 对话框class Cproject_1Dlg : public CDialogEx{// 构造public:Cproject_1Dlg(CWnd* pParent = NULL); // 标准构造函数void Equal2();void Cproject_1Dlg::AddDigit(char numKey);// 对话框数据enum { IDD = IDD_PROJECT_1_DIALOG };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 实现protected:HICON m_hIcon;long double m_op1,m_op2,m_result;int m_operation;int i,s;long double r;long double m_m;long double data[50];bool st1,st2;bool pflag;long double p;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()public:double m_num;CEdit m_control_e;BOOL m_inv;BOOL m_hp;// CString m_sd;CString m_sd;afx_msg void OnClicked1x();afx_msg void OnClickedAdd();afx_msg void OnClickedB1();afx_msg void OnClickedB2();afx_msg void OnClickedB3();afx_msg void OnClickedB4();afx_msg void OnClickedB5();afx_msg void OnClickedB6();afx_msg void OnClickedB7();afx_msg void OnClickedB8();afx_msg void OnClickedB9();afx_msg void OnClickedB10();afx_msg void OnClickedClaer();afx_msg void OnClickedClaer2();afx_msg void OnClickedBp();afx_msg void OnClickedBp2();afx_msg void OnClickedBsp();afx_msg void OnClickedM();afx_msg void OnClickedMc();afx_msg void OnClickedMm();afx_msg void OnClickedMod();afx_msg void OnClickedSqrt();afx_msg void OnClickedMr();afx_msg void OnClickedSubract();afx_msg void OnClickedMul();afx_msg void OnClickedDevide();afx_msg void OnChangeEdit1();afx_msg void OnClickedEqual();};// project_1Dlg.cpp : 实现文件//#include "stdafx.h"#include "project_1.h"#include "project_1Dlg.h"#include "afxdialogex.h"#include<math.h>#ifdef _DEBUG#define new DEBUG_NEW#endif// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogEx{public:CAboutDlg();// 对话框数据enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 实现protected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD){}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)END_MESSAGE_MAP()// Cproject_1Dlg 对话框Cproject_1Dlg::Cproject_1Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(Cproject_1Dlg::IDD, pParent), m_num(0), m_sd(_T("")){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void Cproject_1Dlg::DoDataExchange(CDataExchange* pDX) {CDialogEx::DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT1, m_num);DDX_Control(pDX, IDC_EDIT1, m_control_e);DDX_Text(pDX, IDC_sd, m_sd);}BEGIN_MESSAGE_MAP(Cproject_1Dlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_1x, &Cproject_1Dlg::OnClicked1x)ON_BN_CLICKED(IDC_ADD, &Cproject_1Dlg::OnClickedAdd) ON_BN_CLICKED(IDC_b1, &Cproject_1Dlg::OnClickedB1)ON_BN_CLICKED(IDC_b2, &Cproject_1Dlg::OnClickedB2)ON_BN_CLICKED(IDC_b3, &Cproject_1Dlg::OnClickedB3)ON_BN_CLICKED(IDC_b4, &Cproject_1Dlg::OnClickedB4)ON_BN_CLICKED(IDC_b5, &Cproject_1Dlg::OnClickedB5)ON_BN_CLICKED(IDC_b6, &Cproject_1Dlg::OnClickedB6)ON_BN_CLICKED(IDC_b7, &Cproject_1Dlg::OnClickedB7)ON_BN_CLICKED(IDC_b8, &Cproject_1Dlg::OnClickedB8)ON_BN_CLICKED(IDC_b9, &Cproject_1Dlg::OnClickedB9)ON_BN_CLICKED(IDC_b10, &Cproject_1Dlg::OnClickedB10)ON_BN_CLICKED(IDC_claer, &Cproject_1Dlg::OnClickedClaer)ON_BN_CLICKED(IDC_claer2, &Cproject_1Dlg::OnClickedClaer2) ON_BN_CLICKED(IDC_bp, &Cproject_1Dlg::OnClickedBp)ON_BN_CLICKED(IDC_bp2, &Cproject_1Dlg::OnClickedBp2)ON_BN_CLICKED(IDC_bsp, &Cproject_1Dlg::OnClickedBsp)ON_BN_CLICKED(IDC_M, &Cproject_1Dlg::OnClickedM)ON_BN_CLICKED(IDC_MC, &Cproject_1Dlg::OnClickedMc)ON_BN_CLICKED(IDC_MM, &Cproject_1Dlg::OnClickedMm)ON_BN_CLICKED(IDC_MOD, &Cproject_1Dlg::OnClickedMod)ON_BN_CLICKED(IDC_sqrt, &Cproject_1Dlg::OnClickedSqrt)ON_BN_CLICKED(IDC_MR, &Cproject_1Dlg::OnClickedMr)ON_BN_CLICKED(IDC_SUBRACT, &Cproject_1Dlg::OnClickedSubract) ON_BN_CLICKED(IDC_mul, &Cproject_1Dlg::OnClickedMul)ON_BN_CLICKED(IDC_devide, &Cproject_1Dlg::OnClickedDevide) ON_EN_CHANGE(IDC_EDIT1, &Cproject_1Dlg::OnChangeEdit1)ON_BN_CLICKED(IDC_EQUAL, &Cproject_1Dlg::OnClickedEqual) END_MESSAGE_MAP()// Cproject_1Dlg 消息处理程序BOOL Cproject_1Dlg::OnInitDialog(){CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。
上机指导书一、对话框编程1、建立一个基于对话框的应用程序Calculator;2、为CCalculatorDlg建立对话框资源,如下图所示3、为CCalculatorDlg添加成员变量:char m_buffer[100];//用来存贮需要显示的数字CString m_StrBegin;//记录初始操作数的字符串double m_end;//记录结果操作数double m_begin;//记录初始操作数int m_bit;//记录运算符int m_IsCheckPoint;//判断是否按下了小数点符号,当其为0时,表示没有按下4、为应用程序添加CEdit类的派生类CAdvEdit,并为该类添加三个成员函数:其中OnPaint()为虚函数。
这三个函数的函数体如下:void CAdvEdit::OnDisplay(LPCTSTR lpszStr){m_Caption=lpszStr; OnDraw();}void CAdvEdit::OnDraw(){CRect rect; GetClientRect(&rect);CDC *pDC=GetDC(); pDC-> SetBkMode(TRANSPARENT);CBrush *pBrush=new CBrush(RGB(255,255,255));pDC-> FillRect(&rect,pBrush); pDC-> SetTextColor(RGB(92,92,92));pDC-> DrawText(m_Caption,rect,DT_SINGLELINE|DT_VCENTER|DT_RIGHT);}void CAdvEdit::OnPaint(){CPaintDC dc(this); // device context for paintingOnDraw();}5、对话框资源中的编辑框添加控件类型的成员变量:CAdvEdit m_DspEdit;6、为应用程序CCalculatorDlg类添加成员函数Result()/,来处理运算符操作:void CCalculatorDlg::Result()//用来处理按下符号键时的函数,是计算的核心函数{m_IsCheckPoint = false;m_begin = atof(m_StrBegin);switch(m_bit){ case 1: m_end += m_begin; break; //处理+号case 2: m_end -= m_begin; break; //处理-号case 3: m_end *= m_begin; break; //处理*号,即乘法case 4: //处理/号,即除法if (m_begin==0) { m_DspEdit.OnDisplay("除数不能为零!"); return; }m_end /= m_begin; break;case 5: //处理sqrt号,即开方if (m_end<0) { m_DspEdit.OnDisplay("函数输入无效!"); return; }m_end = sqrt(m_end); break;case 6: //处理1/x号,即求倒数m_end = 1/m_end; break;default: m_end = m_begin; break;}m_begin = 0.0; m_bit = 0; m_StrBegin = "";int i = sprintf(m_buffer,"%10.12f",m_end);//将结果转换为字符串TrimZero(m_buffer,i); //去掉字符串尾部多余的零m_DspEdit.OnDisplay(m_buffer);}7、为对话框的运算符按钮添加消息处理函数:void CCalculatorDlg::AdvButtonPoint() //按下.键时的处理函数{ if (!m_IsCheckPoint && m_StrBegin != ""){ m_StrBegin = m_StrBegin+"."; m_DspEdit.OnDisplay(m_StrBegin);m_IsCheckPoint = true; } }void CCalculatorDlg::AdvButtonAdd(){ Result(); m_bit = 1; }void CCalculatorDlg::AdvButtonSub(){ Result(); m_bit = 2; }void CCalculatorDlg::AdvButtonMul(){ Result(); m_bit = 3; }void CCalculatorDlg::AdvButtonDiv(){ Result(); m_bit = 4; }void CCalculatorDlg::AdvButtonClear(){ m_IsCheckPoint = false; m_StrBegin = "";m_begin = 0.0; m_end = 0.0; m_bit = 0; m_DspEdit.OnDisplay("0."); }void CCalculatorDlg::AdvButtonSqrt(){ Result(); m_bit = 5; }void CCalculatorDlg::AdvButtonReverse(){ Result(); m_bit = 6; }void CCalculatorDlg::AdvButtonEqu() //按下=键时的处理函数{ Result(); m_bit = 7; }8、为对话框的数字按钮添加消息处理函数:void CCalculatorDlg::Button0()//按下0键时的处理函数{ m_StrBegin = m_StrBegin+"0";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::Button1(){ m_StrBegin = m_StrBegin+"1";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::Button2(){ m_StrBegin = m_StrBegin+"2";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::Button3(){ m_StrBegin = m_StrBegin+"3";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::Button4(){ m_StrBegin = m_StrBegin+"4";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::Button5(){ m_StrBegin = m_StrBegin+"5";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::Button6(){ m_StrBegin = m_StrBegin+"6";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::Button7(){ m_StrBegin = m_StrBegin+"7";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::vButton8(){ m_StrBegin = m_StrBegin+"8";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::vButton9(){ m_StrBegin = m_StrBegin+"9";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }9、为应用程序CCalculatorDlg类添加成员函数TrimZerot()/,来去掉字符串尾部多余的零:void CCalculatorDlg::TrimZero(char *pStr,int iLen)//用于去掉字符串尾部多余的零。
MFC实现简易计算器姓名柳超学号**********专业计算机科学与技术指导老师蒋年德2013年01月12日一、设计题目设计一个基于对话框的简单计算器,实现整数、小数的加减乘除四则运算以及开方、阶乘、取对数等操作。
二、运行环境硬件:Haier A60 Notebook,Celeron M 1.86GHz\512MB\250GB软件:Windows xp professional 5.1,visual C++ 6.0三、算法设计的思想打开计算器程序,输入数据,开始时编辑框成员变量m_num初始化为零。
按下数字按钮后,根据bool型变量b_zf判断m_num的正负号,对其进行相关处理,然后在判断是否有小数点,处理后输出结果。
同时根据judge的大小,判断是单目运算还是双目运算,进入不同的处理程序,最终输出结果。
若按下双目运算符,则把m_num存入num2,按下输入第二个操作数并算出结果。
若按下的是单目运算符,则直接对其处理得出结果。
若按下清零,则m_num 等于0.在运算中还要判断运算是否合法,以及结果是否超出显示范围,以做出相关提示,按下清零。
算出后把结果保存至num2。
若需用算出的结果继续运算则回到输入完第一个操作数后,若不需要则判断试否需要开始新一轮的运算,不需要则结束。
四、流程图五、算法分析设计在visual C++ 6.0中新建一个MFC APPWizard[exe]工程文件,文件名为CALU,应用程序类型选为基本对话,完成后,在Dialog中画出计算器的基本控件,包括0~10个数字按钮,符号转换按钮“+/-”,小数点符号“.”,加、减、乘、除四个双目运算符按钮,开方“sqrt”,阶乘“n!”,取对数“ln”等三个单目运算符按钮,计算并显示运算结果的等于号“=”按钮,以及用于退回的“backspace”按钮,清除“clear”按钮和退出“exit”按钮,一个编辑框,用于显示运算值。
最后给每个控件定义ID号和标题。
面向对象编程技术课程设计课题名称:用VC++制作简单计算器用VC++制作简单计算器简述:该课程设计将实现一个简单计算器。
其类似于Windows附件中自带的计算器。
这个计算器可以实现简单的四则运算功能,而且具有简洁大方的图文外观。
系统具有良好的界面和必要的交互信息。
即时准确地获得需要的计算的结果,充分降低了数字计算的难度,从而节约了时间,对人们的生活有一定的帮助。
在课程设计中,程序设计设计语言采用Visual C++,在程序设计中,采用了面向对象解决问题的方法。
课题背景计算器是日常生活中十分便捷有效的工具,能实现加、减、乘、除简单运算的工具。
要实现计算功能,可以用VC++的知识编写程序来解决此问题。
该计算器大大的降低了数字计算的难度及提高了计算的准确度和精确度。
该计算器使用非常简单和方便,对广大中小学生的学习有巨大帮助作用,也对在职人员的工作有点帮助作用。
功能说明系统具有良好的界面;必要的交互信息;简约美观的效果。
使用人员能快捷简单地进行操作。
可单机按钮进行操作即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助。
(1)包含的功能有:加、减、乘、除;(2)计算器上数字分为显示区,可以显示用户所点击的按键,最后显示结果;按键区,可以让用户选择所需的数字以及小数点;功能区,该区域提供用户所需的运算按钮;(3)计算功能基本上是用系统内部函数;(4)“AC”按钮可以清除所有已输入的数据从头计算;(5)“DEL”按钮可以删除所输入的最后以为数字;编辑资源创建步骤新建一个MFC基于对话框的工程VC++对话框界面右击按钮,修改按钮的属性建立类向导最后点击Edit Code就可以添加代码对其它按钮的操作与之类似,对编辑框的“建立类向导”有点区别,这里不附详细步骤代码展示“1”按钮对应的代码void CMyDlg::OnButton1(){UpdateData(1);if(pass1==1 )m_str="1";else m_str+="1";pass1=0;UpdateData(0);}“2”按钮对应的代码void CMyDlg::OnButton2(){UpdateData(1);if(pass1==1 )m_str="2";else m_str+="2";pass1=0;UpdateData(0);}“3”按钮对应的代码void CMyDlg::OnButton3(){UpdateData(1);if(pass1==1 )m_str="3";else m_str+="3";pass1=0;UpdateData(0);}“4”按钮对应的代码void CMyDlg::OnButton3(){UpdateData(1);if(pass1==1 )m_str="4";else m_str+="4";pass1=0;UpdateData(0);}“5、6、7、8、9、0”按钮对应的代码与“1、2、3、4”按钮对应的代码相近“=”按钮对应的代码void CMyDlg::Onresult(){UpdateData(1);int i,z,s,j,x=0,y=1,t,m=1;char b[10];double rate=10.0,itemp=0.0,a[20];for(i=0;i<20;i++)a[i]=1000000.0;for(i=0;i<10;i++)b[i]=' ';z=0;for(i=0;i<m_str.GetLength();i++) {if(isdigit(m_str.GetAt(i))){if(rate==10.0){ itemp=itemp*rate+(m_str.GetAt(i)-'0');if(i==m_str.GetLength()-1)a[z]=itemp;}else{itemp=itemp+rate*(m_str.GetAt(i)-'0');rate=rate/10;if(i==m_str.GetLength()-1)a[z]=itemp;}}else if(m_str.GetAt(i)=='.')rate=0.1;else if(m_str.GetAt(i)=='+') {a[z]=itemp;itemp=0;z++;b[z]='+';z++;rate=10.0;}else if(m_str.GetAt(i)=='-') {a[z]=itemp;itemp=0;z++;b[z]='-';z++;rate=10.0;}else if(m_str.GetAt(i)=='*')a[z]=itemp;itemp=0;z++;b[z]='*';z++;rate=10.0;}else if(m_str.GetAt(i)=='/'){a[z]=itemp;itemp=0;z++;b[z]='/';z++;rate=10.0;}}s=z;for(j=0;j<=s;j++){if(b[j]=='/'){a[j+1]=1/a[j+1];b[j]='*';}}for(j=0;j<=s;j++){if(b[j]=='*'){if(j-t==2){a[t-m]=a[t-m]*a[j+1];m=m+2;}elsea[j-1]=a[j-1]*a[j+1];a[j+1]=1000000.0;b[j]=' ';t=j;}}for(j=0;j<=s;j++){if(a[j]!=1000000.0) //如果a[i]的值不为0.0a[x]=a[j]; //把a[i]的值赋给a[x] x+=2; //x自加2}if(b[j]!=' ') //如果b[i]的值不为空格{b[y]=b[j]; //把b[i]的值赋给b[y]y=y+2; //y自加2}}for(j=0;j<=y-2;j++) {if(b[j]=='+') //如果b[i]等于加号a[0]=a[0]+a[j+1];else if(b[j]=='-') //如果b[i]等于减号a[0]=a[0]-a[j+1];}m_str.Format("%1f",a[0]);UpdateData(0);}“+”按钮对应的代码void CMyDlg::Onadd(){UpdateData(1);m_str+="+";UpdateData(0);}“-”按钮对应的代码void CMyDlg::Onjian(){UpdateData(1);m_str+="-";UpdateData(0);}“*”按钮对应的代码void CMyDlg::Oncheng(){UpdateData(1);m_str+="*";UpdateData(0);}“/”按钮对应的代码void CMyDlg::Onchu(){UpdateData(1);m_str+="/";UpdateData(0);}“AC”按钮对应的代码void CMyDlg::Onac(){UpdateData(1);m_str="0";pass1=1;UpdateData(0);}“DEL”按钮对应的代码void CMyDlg::Ondel(){UpdateData(1);if(m_str!="0" && m_str.GetLength()>1)m_str=m_str.Left(m_str.GetLength()-1);else{m_str="0";}UpdateData(0);}“.”按钮对应的代码void CMyDlg::Onpoint(){UpdateData(1);if(pass1==1)m_str=".";elsem_str+=".";pass1=0;UpdateData(0);}效果图。
南京信息工程大学C++面向对象程序设计课程作业报告设计课题:计算器的设计专业班级:自动化2班学生姓名:学生学号:指导教师:成绩:二○一一年六月二十日计算器的设计一、设计目的学会用MFC设计一个简易计算器,能够求实数的四则运算以及求倒数和平方根,可自己增加功能。
二、需求分析系统目标:设计的计算器至少能够进行简单的四则运算和求倒数求反以及开方运算。
主体功能:实现简单的四则运算和求倒数求反以及开方运算。
开发环境:操作系统:windows XP;编程环境:microsoft visual C++ 6.0 。
三、总体设计思路系统流程图:图1(流程图)基本功能划分:1.加法运算2.减法运算3.乘法运算4.除法运算5.求倒数6.求平方根7.求余数8.取反9.Backspace 功能 10.清零功能 11.操作帮助四、详细设计流程图:图2(流程图)(1)创建工程启动Microsoft Visual利用AppWizard向导,创建一个工程“Calculator”。
选择基本表,Click完成。
(2)设计对话框界面①看到如下界面,Delete删除页面上全部原配控件。
②利用MFC自带的控件选项编辑计算器界面③设计的界面如下当然作为“所见即所得”的MFC控件设计,干净整齐的界面是基本要求,界面是否整洁明了甚至会影响用户的心情。
各控件的属性设置见下表:表1:各个控件控件类型控件的ID 控件的CaptionButton Button Button Button Button Button Button Button Button Button Button Button Button Button Button Button Button IDC_Num0IDC_Num1……IDC_Num9IDC_DotIDC_SignIDC_SubIDC_MulIDC_DivIDC_ClearIDC_SqrtIDC_ReciIDC_EqualIDC_ModIDC_BackspaceIDC_ClearIDC_Help1……9.+/-+-*/sqrt1/x=%BackspaceClearHelp(3)为编辑框“IDC_DISPLAY”连接成员变量为编辑框“IDC_DISPLAY”连接一个CString类型的成员变量m_display,用来显示操作数和运算结果。
MFC实现简易计算器©Free Copy操作简便,还有帮助提示,支持double类型的数据进行运算,显示清除无效0. By: 杜运福计算器类结构如下:class CCalculatorDlg : public CDialog{// Constructionpublic:CCalculatorDlg(CWnd* pParent = NULL); // standard constructor// Dialog Data//{{AFX_DA TA(CCalculatorDlg)enum { IDD = IDD_CALCULA TOR_DIALOG };double m_Num;//}}AFX_DA TAdouble num1,num2; //第一、二操作数char cal; //运算符号BYTE dotflag; //小数点标志BYTE numflag; //键入数字标志long quan2; //小数部分权值// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CCalculatorDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected:HICON m_hIcon;// Generated message map functions//{{AFX_MSG(CCalculatorDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnNum0();afx_msg void OnNum1();afx_msg void OnNum2();afx_msg void OnNum3();afx_msg void OnNum4();afx_msg void OnNum5();afx_msg void OnNum6();afx_msg void OnNum7();afx_msg void OnNum8();afx_msg void OnNum9();afx_msg void OnAdd();afx_msg void OnSub();afx_msg void OnMul();afx_msg void OnDiv();afx_msg void OnEqual();afx_msg void OnSign();afx_msg void OnInv();afx_msg void OnMod();afx_msg void OnSqrt();afx_msg void OnDot();afx_msg void OnClear();afx_msg void OnBackspace();afx_msg void OnHelp();//}}AFX_MSGDECLARE_MESSAGE_MAP()};完整实现代码如下:// CalculatorDlg.cpp : implementation file///****************************************************************************** *********** 简易计算器***** by 追梦2011-4-18******************************************************************************* *****/#include "stdafx.h"#include "Calculator.h"#include "CalculatorDlg.h"#include "math.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DA TA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DA TA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support//}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DA TA_INIT(CAboutDlg)//}}AFX_DA TA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DA TA_MAP(CAboutDlg)//}}AFX_DA TA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CCalculatorDlg dialogCCalculatorDlg::CCalculatorDlg(CWnd* pParent /*=NULL*/): CDialog(CCalculatorDlg::IDD, pParent){//{{AFX_DA TA_INIT(CCalculatorDlg)m_Num = 0.0;//}}AFX_DA TA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CCalculatorDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DA TA_MAP(CCalculatorDlg)DDX_Text(pDX, IDC_Num, m_Num);//}}AFX_DA TA_MAP}BEGIN_MESSAGE_MAP(CCalculatorDlg, CDialog) //{{AFX_MSG_MAP(CCalculatorDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_Num0, OnNum0)ON_BN_CLICKED(IDC_Num1, OnNum1)ON_BN_CLICKED(IDC_Num2, OnNum2)ON_BN_CLICKED(IDC_Num3, OnNum3)ON_BN_CLICKED(IDC_Num4, OnNum4)ON_BN_CLICKED(IDC_Num5, OnNum5)ON_BN_CLICKED(IDC_Num6, OnNum6)ON_BN_CLICKED(IDC_Num7, OnNum7)ON_BN_CLICKED(IDC_Num8, OnNum8)ON_BN_CLICKED(IDC_Num9, OnNum9)ON_BN_CLICKED(IDC_Add, OnAdd)ON_BN_CLICKED(IDC_Sub, OnSub)ON_BN_CLICKED(IDC_Mul, OnMul)ON_BN_CLICKED(IDC_Div, OnDiv)ON_BN_CLICKED(IDC_Equal, OnEqual)ON_BN_CLICKED(IDC_Sign, OnSign)ON_BN_CLICKED(IDC_Inv, OnInv)ON_BN_CLICKED(IDC_Mod, OnMod)ON_BN_CLICKED(IDC_Sqrt, OnSqrt)ON_BN_CLICKED(IDC_Dot, OnDot)ON_BN_CLICKED(IDC_Clear, OnClear)ON_BN_CLICKED(IDC_Backspace, OnBackspace) ON_BN_CLICKED(IDC_Help, OnHelp)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CCalculatorDlg message handlers//////////////////////////////////////////////////////////////////////////// BOOL CCalculatorDlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARA TOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization herequan2 = 1;dotflag = 0;numflag = 0;return TRUE; // return TRUE unless you set the focus to a control}void CCalculatorDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// If you add a minimize button to your dialog, you will need the code below// to draw the icon. For MFC applications using the document/view model,// this is automatically done for you by the framework.void CCalculatorDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}// The system calls this to obtain the cursor to display while the user drags// the minimized window.HCURSOR CCalculatorDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}//键入0void CCalculatorDlg::OnNum0(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 0 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 0;}else m_Num = 0;}numflag = 1;UpdateData(FALSE);}//键入 1void CCalculatorDlg::OnNum1(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 1 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 1;}else m_Num = 1;}numflag = 1;UpdateData(FALSE);}//键入 2void CCalculatorDlg::OnNum2(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 2 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 2;}else m_Num = 2;}numflag = 1;UpdateData(FALSE);}//键入 3void CCalculatorDlg::OnNum3(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 3 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 3;}else m_Num = 3;}numflag = 1;UpdateData(FALSE);}//键入 4void CCalculatorDlg::OnNum4(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 4 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 4;}else m_Num = 4;}numflag = 1;UpdateData(FALSE);}//键入 5void CCalculatorDlg::OnNum5(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 5 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 5;}else m_Num = 5;}numflag = 1;UpdateData(FALSE);}//键入 6void CCalculatorDlg::OnNum6(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 6 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 6;}else m_Num = 6;}numflag = 1;UpdateData(FALSE);}//键入7void CCalculatorDlg::OnNum7(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 7 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 7;}else m_Num = 7;}numflag = 1;UpdateData(FALSE);}//键入8void CCalculatorDlg::OnNum8(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 8 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 8;}else m_Num = 8;}numflag = 1;UpdateData(FALSE);}//键入9void CCalculatorDlg::OnNum9(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 9 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 9;}else m_Num = 9;}numflag = 1;UpdateData(FALSE);}//键入+void CCalculatorDlg::OnAdd(){UpdateData();num1 = m_Num;cal = '+';numflag = 0;dotflag = 0;quan2 = 1;}//键入-void CCalculatorDlg::OnSub(){UpdateData();num1 = m_Num;cal = '-';numflag = 0;dotflag = 0;quan2 = 1;}//键入*void CCalculatorDlg::OnMul(){UpdateData();num1 = m_Num;cal = '*';numflag = 0;dotflag = 0;quan2 = 1;}//键入/void CCalculatorDlg::OnDiv(){UpdateData();num1 = m_Num;cal = '/';numflag = 0;dotflag = 0;quan2 = 1;}//键入%void CCalculatorDlg::OnMod(){UpdateData();num1 = m_Num;cal = '%';numflag = 0;dotflag = 0;quan2 = 1;}//键入=void CCalculatorDlg::OnEqual(){UpdateData();num2 = m_Num;switch(cal){case '+': m_Num = num1 + num2; break;case '-': m_Num = num1 - num2; break;case '*': m_Num = num1 * num2; break;case '/': m_Num = num1 / num2; break;case '%': m_Num = (int)num1 % (int)num2; break;}numflag = 0;dotflag = 0;quan2 = 1;UpdateData(FALSE);}//键入+/-void CCalculatorDlg::OnSign(){UpdateData();m_Num = 0 - m_Num;UpdateData(FALSE);}//键入1/xvoid CCalculatorDlg::OnInv(){UpdateData();m_Num = 1 / m_Num;numflag = 0;dotflag = 0;quan2 = 1;UpdateData(FALSE);}//键入sqrtvoid CCalculatorDlg::OnSqrt(){UpdateData();m_Num = sqrt(m_Num);numflag = 0;dotflag = 0;quan2 = 1;UpdateData(FALSE);}//键入'.' 小数点void CCalculatorDlg::OnDot(){UpdateData();dotflag = 1;m_Num += 0.0;UpdateData(FALSE);}void CCalculatorDlg::OnClear(){UpdateData();m_Num = 0;num1 = 0;num2 = 0;numflag = 0;dotflag = 0;quan2 = 1;UpdateData(FALSE);}//撤销之前键入的数,可以依次撤销所有整数位或小数位void CCalculatorDlg::OnBackspace(){UpdateData();static int dotquan = quan2; //一次初始化long temp;if(dotflag && numflag) //撤销小数部分{if(dotquan >= 10){temp = (long)(m_Num * dotquan);m_Num= (double)(temp/10);dotquan /= 10;m_Num= m_Num / dotquan;}}else //撤销整数部分{if(numflag && m_Num){ m_Num = (long)m_Num /10;}}UpdateData(FALSE);}//帮助提示void CCalculatorDlg::OnHelp(){const char tipname[]="简易计算器帮助by 追梦";MessageBox("\t简易计算器\tby追梦\n\n 只用一个文本编辑框,用于输入和输出,接受粘贴或键盘输入。
C语⾔MFC基础之计算器详解⽬录基于MFC计算器(基础点)需求:把计算器运算的过程呈现出来。
基础点总结基于MFC计算器(基础点)主要是在实现MFC计算器的过程中碰到的⼀些问题,和补充的⼀些知识。
需求:把计算器运算的过程呈现出来。
想法:利⽤两个队列,⼀个存储输⼊的字符串(表达式),⼀个存放结果。
分别命名为queue1,和myqueue,让字符串从左到右依次⼊队列。
但之后按照⾃⼰的思路去推演,发现如果进⼊队列的是1+23,如果下⼀个字符⼊队的是“+”,那么先计算23的结果⼊队myqueue中,⽽queue1中还储存1,但下⼀个“+”⼊ queue1之后,此时queue1中包含1+,最后把myqueue中的元素和queue1结合,最终在编辑框⽂本中显⽰的是:1+6;如果下⼀个运算符是“*”,那么直接输出队列中的字符串。
在实现的过程中会涉及到类型转换,⽐如CString转换成浮点型。
⽬前还没有实现,主要原因在于对基础的语法不熟悉,还不太会使⽤先总结前⼀段时间碰到的⼀些问题,和解决⽅案。
基础点stack,queue,⽽map函数映射库是char到int的映射,实现了优先级的定义。
C++中的compare():涌来进⾏字符串以及⼦串之间的⽐较。
getline():读整⾏,包括前导和嵌⼊的空格并将其储存在字符串对象中。
length=strlen():遍历字符串strlen():可以做⼀个计数器,从内存的某个位置扫描,直到碰到第⼀个字符串结束符‘\0'为⽌,返回计算器值bool类型做判断:true,falsef分别是:对错,是⾮,正反atof():把字符转化为浮点数ofstream():写操作ofstream fout:是对C++SIT中对⽂件操作的合集,包含了常⽤的所有⽂件操作:插⼊器,析取器fout.open(“txt”,ios::out):打开⽂件流ifstream():读操作,从硬盘到内存fstream():同时进⾏读写ios:in,⽂件以输⼊的⽅式打开。
MFC开发——计算器制作由于之前QT⾥⾯做过计算器,所以这次在MFC⾥⾯制作,除了函数库不同之外,逻辑都是照上⼀次的,⽽且最近特别忙,所以不会讲解太多,详情可以参考第⼀步:界⾯设计建⽴基本对话框项⽬设计界⾯如下第⼆步,功能实现头⽂件⾥⾯private:CString m_str; //显⽰内容int m_num1; //储存数字1int m_num2; //储存数字2int m_result; //储存答案int m_opera; //储存加减乘除,1代表+,2代表-,3代表*,4代表/bool m_opera_has_click; //判断加减乘除是否已经按下bool m_num1_has_click;//判断num1已经按下构造函数m_str="";m_num1=0;m_num2=0;m_result=0;m_opera_has_click=false;m_num1_has_click=false;按钮功能实现//////////////////////0~9按钮的实现/////////////////////////////void CCalculatorDlg::OnButton1() //按下1{// TODO: Add your control notification handler code hereif(m_opera_has_click==false)//判断是否按下了运算符,没按下输⼊数字1,按下了则输⼊数字2{m_num1=m_num1*10+1;m_str+="1";GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);m_num1_has_click=true;}else{m_num2=m_num2*10+1;m_str+="1";GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);}}void CCalculatorDlg::OnButton2(){// TODO: Add your control notification handler code hereif(m_opera_has_click==false){m_num1=m_num1*10+2;m_str+="2";GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);m_num1_has_click=true;}else{m_num2=m_num2*10+2;m_str+="2";GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);}}void CCalculatorDlg::OnButton3(){// TODO: Add your control notification handler code hereif(m_opera_has_click==false)//判断是否按下了运算符,没按下输⼊数字1,按下了则输⼊数字2{m_num1=m_num1*10+3;m_str+="3";GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);m_num1_has_click=true;}else{m_num2=m_num2*10+3;m_str+="3";GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);}}void CCalculatorDlg::OnButton4(){// TODO: Add your control notification handler code hereif(m_opera_has_click==false)//判断是否按下了运算符,没按下输⼊数字1,按下了则输⼊数字2 {m_num1=m_num1*10+4;m_str+="4";GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);m_num1_has_click=true;}else{m_num2=m_num2*10+4;m_str+="4";GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);}}void CCalculatorDlg::OnButton5(){// TODO: Add your control notification handler code hereif(m_opera_has_click==false)//判断是否按下了运算符,没按下输⼊数字1,按下了则输⼊数字2 {m_num1=m_num1*10+5;m_str+="5";GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);m_num1_has_click=true;}else{m_num2=m_num2*10+5;m_str+="5";GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);}}void CCalculatorDlg::OnButton6(){// TODO: Add your control notification handler code hereif(m_opera_has_click==false)//判断是否按下了运算符,没按下输⼊数字1,按下了则输⼊数字2 {m_num1=m_num1*10+6;m_str+="6";GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);m_num1_has_click=true;}else{m_num2=m_num2*10+6;m_str+="6";GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);}}void CCalculatorDlg::OnButton7(){// TODO: Add your control notification handler code hereif(m_opera_has_click==false)//判断是否按下了运算符,没按下输⼊数字1,按下了则输⼊数字2 {m_num1=m_num1*10+7;m_str+="7";GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);m_num1_has_click=true;}else{m_num2=m_num2*10+7;m_str+="7";GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);}}void CCalculatorDlg::OnButton8(){// TODO: Add your control notification handler code hereif(m_opera_has_click==false)//判断是否按下了运算符,没按下输⼊数字1,按下了则输⼊数字2{m_num1=m_num1*10+8;m_str+="8";GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);m_num1_has_click=true;}else{m_num2=m_num2*10+8;m_str+="8";GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);}}void CCalculatorDlg::OnButton9(){// TODO: Add your control notification handler code hereif(m_opera_has_click==false)//判断是否按下了运算符,没按下输⼊数字1,按下了则输⼊数字2{m_num1=m_num1*10+9;m_str+="9";GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);m_num1_has_click=true;}else{m_num2=m_num2*10+9;m_str+="9";GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);}}void CCalculatorDlg::OnButton0(){// TODO: Add your control notification handler code hereif(m_opera_has_click==false)//判断是否按下了运算符,没按下输⼊数字1,按下了则输⼊数字2{m_num1=m_num1*10+0;m_str+="0";GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);m_num1_has_click=true;}else{m_num2=m_num2*10+0;m_str+="0";GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);}}/////////////////////////运算符的实现/////////////////////////////void CCalculatorDlg::OnButtonAdd() //按下加号{// TODO: Add your control notification handler code hereif(m_opera_has_click==false&&m_num1_has_click==true)//判断是否按下了运算符与数字1,防⽌按下多次运算符与开始按下运算符 {m_str+="+";GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);m_opera_has_click=true;m_opera=1;}}void CCalculatorDlg::OnButtonDel() //按下减号{// TODO: Add your control notification handler code hereif(m_opera_has_click==false&&m_num1_has_click==true)//判断是否按下了运算符与数字1,防⽌按下多次运算符与开始按下运算符 {m_str+="-";GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);m_opera_has_click=true;m_opera=2;}}void CCalculatorDlg::OnButtonMul() //按下乘号{// TODO: Add your control notification handler code hereif(m_opera_has_click==false&&m_num1_has_click==true)//判断是否按下了运算符与数字1,防⽌按下多次运算符与开始按下运算符{m_str+="*";GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);m_opera_has_click=true;m_opera=3;}}void CCalculatorDlg::OnButtonDiv() //按下除号{// TODO: Add your control notification handler code hereif(m_opera_has_click==false&&m_num1_has_click==true)//判断是否按下了运算符与数字1,防⽌按下多次运算符与开始按下运算符 {m_str+="/";GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);m_opera_has_click=true;m_opera=4;}}void CCalculatorDlg::OnButtonEqual() //按下等号{// TODO: Add your control notification handler code hereif(m_opera_has_click==true&&m_num1_has_click==true)//防⽌开始按下等号{switch(m_opera){case 1:m_result=m_num1+m_num2;break;case 2:m_result=m_num1-m_num2;break;case 3:m_result=m_num1*m_num2;break;case 4:if(m_num2==0)//防⽌除数为0{MessageBox("错误:除数为0");//重置数据m_opera_has_click=false;m_num1_has_click=false;m_str="";m_num1=0;m_num2=0;m_result=0;GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);break;}else{m_result=m_num1/m_num2;break;}}//计算显⽰结果m_str.Format("%d",m_result);GetDlgItem(IDC_EDIT1)->SetWindowText(m_str);//重置数据m_opera_has_click=false;m_num1_has_click=false;m_str="";m_num1=0;m_num2=0;m_result=0;}}void CCalculatorDlg::OnButtonClear() //按下清除键{// TODO: Add your control notification handler code here//重置数据m_str="";m_num1=0;m_num2=0;m_result=0;m_opera_has_click=false;m_num1_has_click=false;//清空屏幕GetDlgItem(IDC_EDIT1)->SetWindowText(m_str); }最后效果如图。
学院软件与微电子学院目录1 摘要 (3)1.1设计题目 (3)1.2设计内容 (3)1.3开发工具 (3)1.4应用平台 (3)2 详细设计 (3)2.1程序结构 (3)2.2主要功能 (4)2.3函数实现 (6)2.4开发日志 (7)3 程序调试及运行 (7)3.1程序运行结果 (12)3.2程序使用说明 (12)3.3程序开发总结 (12)4 附件(源程序) (13)1 摘要1.1 设计题目10.编写窗口程序,实现计算器1.2 设计内容(1)实现基本的算术运算(如加、减,乘、除、幂次运算,开方等)(2)实现基本函数运算(如三角函数、对数函数)1.3 开发工具Visual C++ 6.0和Win32。
1.4 应用平台Windows 2000/XP/Vista 32位2 详细设计2.1 程序结构如图是整个计算器的流程图,打开计算器程序,输入数据,调用输入数据子程序。
子程序开始是m_num 为零。
按下数字按钮后,判断m_num的正负号,对其进行相关处理,然后再判断是否有小数点,处理后输出结果。
回到总流程图中,输完第一个操作数后,若按下双目运算符,则把m_num存入num2,按下输入第二个操作数并算出结果。
若按下的是单目运算符,则直接对其处理得出结果。
若按下清零,则m_num等于0.在运算中还要判断运算是否合法,以及结果是否超出显示范围,已做出相关提示,按下清零。
算出后把结果保存至num2。
若需用算出的结果继续运算则回到输入完第一个操作数后,若不需要则判断是否需要开始新一轮的运算,不需要则结束。
2.2 主要功能(1)包含的功能有:加、减、乘、除运算,还有开方、求倒数等功能。
(2)计算器上数字0——9为一个控件数组,加、减、乘、除为一个控件数组,其余为单一控件。
(3)计算功能基本上是用系统内部函数。
(4)程序可以自动判断输入数据的正确性,保证不出现多余一个小数点、以0开头等不正常现象(5)“Clear”按钮可以清除所有已输入的数据从头计算。
手把手教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,方法同上
如下图