1、MFC计算器编程设计报告MFC计算器课程设计报告地信091 指导老师: 2010.11.15一题目:利用MFC框架编写简易计算器要求使用MFC框架在Visual Studio 6.0环境下编写一个简易的计算器,支持任意位数的加减乘数,正负转换,并且实现BackSpace CE C功能。二设计过程1. Windows消息处理机制的理解 首先编写程序需要对Windows程序的消息处理机制(Message Handle)有个比较清晰的了解。Windows的程序都是通过消息来传送数据,有不需要用户参与的系统消息,比如异常处理等。还有用户消息,比如鼠标的单击,双击,键盘的键入等。2. 界面的设计仿照Wi
2、ndows附件里面的计算器,在资源视图中画好界面,如图: 主要使用到Layout菜单中的Align功能对各个按钮进行对其,使界面更加整洁。拖出的控件有上面的一个Edit控件用于显示数字,Button控件用于处理鼠标的消息。 3. 建立的变量,控件的命名,对应的消息处理函数对应表IDCAPTIONMessage HandlerIDD_CALC_DIALOG简易计算器 1.0 Beta1版N/AIDC_NUM00OnNum0IDC_NUM11OnNum1IDC_NUM22OnNum2IDC_NUM33OnNum3IDC_NUM44OnNum4IDC_NUM55OnNum5IDC_NUM66OnNu
3、m6IDC_NUM77OnNum7IDC_NUM88OnNum8IDC_NUM99OnNum9IDC_NEG+/-OnNegIDC_PT.OnPtIDC_DIV/OnDivIDC_MUL*OnMulIDC_MIN-OnMinIDC_ADD+OnAddIDC_BACKSPACEBACKOnBackspaceIDC_CECEOnCeIDC_CLEARCOnClearIDC_EQU=OnEquIDC_DISN/AN/AOnCal(double num)变量定义: double poz; /保存小数点的位置,初始化为1,表示poz-1个小数点。 double m_Dis; /Edit控件上需要显示的数
4、字 BOOL point_flag; /小数点表示位,判定是否是小数,是小数为1,不是小数为0。 double numfirst; /保存计算过程中的前一个数字, double numsecond;/保存计算过程中的第二个数字 char op;/记录当前的计算符号,可以为+,-,*,/,=,c,n变量初始化: poz=1; m_Dis = 0.0; numfirst=0; numsecond=0; op=0; 4. 设计思路a) 首先考虑对所有按键分为两类,数字类和符号类,0,1,2,3,4,5,6,7,8,9为数字类,+,-,*,/,=为符号类。数字在计算的过程中最多需要保存两个,所以定义了
5、两个double型变量numfirst和numsecond来进行存储。符号需要一个char op来存储。b) 然后考虑在计算的过程中,numfirst和numsecond的存储状态有三种,一种是numfirst=0 & numsecond=0 也就是程序刚开始运行还没有开始录入数字的状态。二种是numfirst!=0 & numsecond=0 也就是第一个数字已经录入,符号也已经录入时候把m_Dis的值直接赋值给numfirst,第三种是numfirst!=0 &numsecond!=0,表示可以通过op来把两数合并为一个数。c) 考虑到该计算器支持连续的计算,比如3.33+1.33*88/
6、96= ?。所以必须在点符号Button也要计算出之前的结果,通过判断op,来计算,把两个数字合并为一个数字,方便下一次运算,功能近似于点=,所以把=也划分到符号类。d) 因为数字全部使用的是double,键入的数字必须通过一定的处理达到累加的效果,加上小数和整数的处理差异性大,所以分别用point_flag来判断,分别出来小数和整数。5. 成员函数及其释义 因为对OnNum0()到OnNum9()的处理函数差异仅在一个数字上,可以通过调用一个共同的函数OnCal(double num)来简化源代码长度,增加模块性。void CCalcDlg:OnCal(double num) /分三种状态来
7、处理 if(numfirst!=0 & numsecond!=0) if(point_flag=TRUE) /判定为小数 poz*=0.1; /小数进位 m_Dis=m_Dis+poz*num;/递增 UpdateData(false); /把结果从内存传递到屏幕 else m_Dis=m_Dis*10+num; UpdateData(false); if(numfirst!=0 & numsecond=0) if(point_flag=TRUE) poz*=0.1; m_Dis=m_Dis+poz*num; UpdateData(false); else/判定为整数 m_Dis=m_Dis*
8、10+num;/递增 UpdateData(false); if(numfirst=0 & numsecond=0) if(point_flag=TRUE) poz*=0.1; m_Dis=m_Dis+poz*num; UpdateData(false); else m_Dis=m_Dis*10+num; UpdateData(false); 以OnAdd()为例子讲解符号的处理函数,函数的功能是先判定之前按下字符时op的值,更具op的值来进行相应的运算。void CCalcDlg:OnAdd() /根据numfirst和numsecond和op的值分为5种状态。 if(numfirst!=0
9、 & numsecond=0&op=+) numsecond=m_Dis; numfirst=numfirst+numsecond; /之前按的是加把两个数赋值到前一个数 m_Dis=numfirst;/赋值给屏幕 numsecond=0; /从新赋值为0,清空,不影响下一次判断 UpdateData(FALSE); m_Dis=0; /屏幕的值同时清空 if(numfirst!=0 & numsecond=0&op=-) numsecond=m_Dis; numfirst=numfirst-numsecond; m_Dis=numfirst; numsecond=0; UpdateData(
10、FALSE); m_Dis=0; if(numfirst!=0 & numsecond=0&op=*) numsecond=m_Dis; numfirst=numfirst*numsecond; m_Dis=numfirst; numsecond=0; UpdateData(FALSE); m_Dis=0; if(numfirst!=0 & numsecond=0&op=/) numsecond=m_Dis; numfirst=numfirst/numsecond; m_Dis=numfirst; numsecond=0; UpdateData(FALSE); m_Dis=0; if(numf
11、irst=0 & numsecond=0) /该状态为程序启动还没有开始录入输入的状态 numfirst=m_Dis; /屏幕的值赋值到numfirst UpdateData(FALSE); m_Dis=0; op=+; /最后记录最后一个操作是+ poz=1;/小数点位置归位 point_flag=FALSE;/默认小数点标志为整数,也就是0,也就是FALSE“+/-“按钮的处理函数void CCalcDlg:OnNeg() m_Dis=-m_Dis;/换个符号,其他都一样 UpdateData(FALSE); poz=1; point_flag=FALSE;.按钮的处理函数void CCa
12、lcDlg:OnPt() point_flag=TRUE; /把标志位改为“小数点”状态“Backspace”按钮的处理void CCalcDlg:OnBackspace() /主要通过_gcvt()和strtod()函数进行字符串和浮点数之间的转换 char buffer30; /定义个装字符的数组 _gcvt(m_Dis,sizeof(m_Dis),buffer); /把m_Dis存的数字转换为string for(int i=0;i30;i+) if(bufferi=.& bufferi+1=0)/判断是否为整数 point_flag=FALSE; /标志位设置为“整数位” break;
13、 if(point_flag=TRUE) /如果是小数 for(int j=0;jmessage,pMsg-wParam,pMsg-lParam); return CDialog:PreTranslateMessage(pMsg);/ CalculatorDlg.cpp : implementation file/#include stdafx.h#include Calculator.h#include CalculatorDlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_
14、;#endif/ CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialogpublic: CAboutDlg(); / Dialog Data /AFX_DATA(CAboutDlg) enum IDD = IDD_ABOUTBOX ; /AFX_DATA / ClassWizard generated virtual function overrides /AFX_VIRTUAL(CAboutDlg)protected: virtual void DoDataExchange(CDataExchange* pDX)
15、; / DDX/DDV support /AFX_VIRTUAL / Implementationprotected: /AFX_MSG(CAboutDlg) /AFX_MSG DECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD) /AFX_DATA_INIT(CAboutDlg) /AFX_DATA_INITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX); /AFX_DATA_MAP(CAboutDlg
16、) /AFX_DATA_MAPBEGIN_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_DATA_INIT(CCalculatorDlg) poz=1; numfirst=0; numsecond
17、=0; op=0; m_Dis = 0.0;/ num=0; /AFX_DATA_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_DATA_MAP(CCalculatorDlg) DDX_Text(pDX, IDC_EDIT
18、, m_Dis); /AFX_DATA_MAPBEGIN_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)
19、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_NEG, OnNeg) ON_BN_CLICKED(IDC_PT, OnPt) ON_BN_CLICKED(IDC_BACKSPACE, OnBackspace) ON_BN_CLICKED(I
20、DC_CE, OnCe) ON_BN_CLICKED(IDC_CLEAR, OnClear) ON_BN_CLICKED(IDC_MIN, OnMin) ON_BN_CLICKED(IDC_MUL, OnMul) ON_BN_CLICKED(IDC_DIV, OnDiv) ON_BN_CLICKED(IDC_EOU, OnEou) /AFX_MSG_MAPEND_MESSAGE_MAP()/ CCalculatorDlg message handlersBOOL CCalculatorDlg:OnInitDialog() CDialog:OnInitDialog(); / Add About.
21、 menu item to system menu. / IDM_ABOUTBOX must be in the system command range. ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR); pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); / Set the icon for this dialog. The framework does this automaticall
22、y / when the applications main window is not a dialog SetIcon(m_hIcon, TRUE); / Set big icon SetIcon(m_hIcon, FALSE); / Set small icon / TODO: Add extra initialization here return TRUE; / return TRUE unless you set the focus to a controlvoid 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/
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1