【文件属性】:
文件名称:mfc可视化计算器编程
文件大小:1.7MB
文件格式:RAR
更新时间:2014-01-14 10:55:44
计算器
MFC计算器课程设计报告
地信091
指导老师:
2010.11.15
一.题目:利用MFC框架编写简易计算器
要求使用MFC框架在Visual Studio 6.0环境下编写一个简易的计算器,支持任意位数的加减乘数,正负转换,并且实现BackSpace CE C功能。
二.设计过程
1. Windows消息处理机制的理解
首先编写程序需要对Windows程序的消息处理机制(Message Handle)有个比较清晰的了解。Windows的程序都是通过消息来传送数据,有不需要用户参与的系统消息,比如异常处理等。还有用户消息,比如鼠标的单击,双击,键盘的键入等。
2. 界面的设计
仿照Windows附件里面的计算器,在资源视图中画好界面,如图:
主要使用到Layout菜单中的Align功能对各个按钮进行对其,使界面更加整洁。拖出的控件有上面的一个Edit控件用于显示数字,Button控件用于处理鼠标的消息。
3. 建立的变量,控件的命名,对应的消息处理函数对应表
ID CAPTION Message Handler
IDD_CALC_DIALOG 简易计算器 1.0 Beta1版 N/A
IDC_NUM0 0 OnNum0
IDC_NUM1 1 OnNum1
IDC_NUM2 2 OnNum2
IDC_NUM3 3 OnNum3
IDC_NUM4 4 OnNum4
IDC_NUM5 5 OnNum5
IDC_NUM6 6 OnNum6
IDC_NUM7 7 OnNum7
IDC_NUM8 8 OnNum8
IDC_NUM9 9 OnNum9
IDC_NEG +/- OnNeg
IDC_PT . OnPt
IDC_DIV / OnDiv
IDC_MUL * OnMul
IDC_MIN - OnMin
IDC_ADD + OnAdd
IDC_BACKSPACE BACK OnBackspace
IDC_CE CE OnCe
IDC_CLEAR C OnClear
IDC_EQU = OnEqu
IDC_DIS N/A N/A
OnCal(double num)
变量定义:
double poz; //保存小数点的位置,初始化为1,表示poz-1个小数点。
double m_Dis; //Edit控件上需要显示的数字
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为数字类,+,-,*,/,=为符号类。数字在计算的过程中最多需要保存两个,所以定义了两个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/96= ?。所以必须在点符号Button也要计算出之前的结果,通过判断op,来计算,把两个数字合并为一个数字,方便下一次运算,功能近似于点=,所以把=也划分到符号类。
d) 因为数字全部使用的是double,键入的数字必须通过一定的处理达到累加的效果,加上小数和整数的处理差异性大,所以分别用point_flag来判断,分别出来小数和整数。
5. 成员函数及其释义
因为对OnNum0()到OnNum9()的处理函数差异仅在一个数字上,可以通过调用一个共同的函数OnCal(double num)来简化源代码长度,增加模块性。
void CCalcDlg::OnCal(double num)
{ //分三种状态来处理
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*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 && 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(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(numfirst==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 CCalcDlg::OnPt()
{
point_flag=TRUE; //把标志位改为“小数点”状态
}
“Backspace”按钮的处理
void CCalcDlg::OnBackspace()
{
//主要通过_gcvt()和strtod()函数进行字符串和浮点数之间的转换
char buffer[30]; //定义个装字符的数组
_gcvt(m_Dis,sizeof(m_Dis),buffer); //把m_Dis存的数字转换为string
for(int i=0;i<30;i++)
{
if(buffer[i]=='.'&& buffer[i+1]==0)//判断是否为整数
{
point_flag=FALSE; //标志位设置为“整数位”
break;
}
}
if(point_flag==TRUE) //如果是小数
{
for(int j=0;j<30;j++)
{
if(buffer[j]==0)
{
buffer[j-1]=0; //把’\0’之前的字符赋值为’\0’,就相当于剪掉最后一位
break;
}
}
}
else //如果是整数
{
buffer[i-1]=0; //剪掉’.’之前那位
}
m_Dis=strtod(buffer,NULL);//再用strtod弄成浮点数
UpdateData(FALSE);
poz=1;
}
‘CE’按钮处理函数
void CCalcDlg::OnCe()
{
if(numfirst!=0 && numsecond==0)//CE只能修改第二个数字
{
m_Dis=0; //把屏幕的值赋值为0
UpdateData(FALSE);//并显示出来
}
}
‘C’按钮处理函数
void CCalcDlg::OnClear()
{
op=NULL; //清空符号
numfirst=0;//清空第一个数字
numsecond=0;//清空第二个数字
point_flag=FALSE;//改为默认整数位
poz=1;//小数点归位
m_Dis=0;
UpdateData(FALSE); //屏幕显示归0
}
键盘响应:
void CCalcDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
switch(nChar)
{
case VK_NUMPAD0:
OnNum0();break;
case VK_NUMPAD1:
OnNum1();break;
case VK_NUMPAD2:
OnNum2();break;
case VK_NUMPAD3:
OnNum3();break;
case VK_NUMPAD4:
OnNum4();break;
case VK_NUMPAD5:
OnNum5();break;
case VK_NUMPAD6:
OnNum6();break;
case VK_NUMPAD7:
OnNum7();break;
case VK_NUMPAD8:
OnNum8();break;
case VK_NUMPAD9:
OnNum9();break;
case VK_ADD:
OnAdd();break;
case VK_SUBTRACT:
OnMin();break;
case VK_MULTIPLY:
OnMul();break;
case VK_DIVIDE:
OnDiv();break;
case VK_BACK:
OnBackspace();break;
case VK_DECIMAL:
OnPt();break;
case VK_DELETE:
OnBackspace();break;
case VK_RETURN:
OnEqu();break;
}
CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}
BOOL CCalcDlg::PreTranslateMessage(MSG* pMsg)
{
SendMessage(pMsg->message,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_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
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); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCalculatorDlg dialog
CCalculatorDlg::CCalculatorDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCalculatorDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCalculatorDlg)
poz=1;
numfirst=0;
numsecond=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, m_Dis);
//}}AFX_DATA_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_NEG, OnNeg)
ON_BN_CLICKED(IDC_PT, OnPt)
ON_BN_CLICKED(IDC_BACKSPACE, OnBackspace)
ON_BN_CLICKED(IDC_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_MAP
END_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_SEPARATOR);
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 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 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 painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int 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 icon
dc.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;
}
void CCalculatorDlg::OnCal(double num)
{//分三种状态来处理
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*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);
}
}
}
void CCalculatorDlg::OnNum0()
{
// TODO: Add your control notification handler code here
OnCal(0);
}
void CCalculatorDlg::OnNum1()
{
// TODO: Add your control notification handler code here
OnCal(1);
}
void CCalculatorDlg::OnNum2()
{
// TODO: Add your control notification handler code here
OnCal(2);
}
void CCalculatorDlg::OnNum3()
{
// TODO: Add your control notification handler code here
OnCal(3);
}
void CCalculatorDlg::OnNum4()
{
// TODO: Add your control notification handler code here
OnCal(4);
}
void CCalculatorDlg::OnNum5()
{
// TODO: Add your control notification handler code here
OnCal(5);
}
void CCalculatorDlg::OnNum6()
{
// TODO: Add your control notification handler code here
OnCal(6);
}
void CCalculatorDlg::OnNum7()
{
// TODO: Add your control notification handler code here
OnCal(7);
}
void CCalculatorDlg::OnNum8()
{
// TODO: Add your control notification handler code here
OnCal(8);
}
void CCalculatorDlg::OnNum9()
{
// TODO: Add your control notification handler code here
OnCal(9);
}
void CCalculatorDlg::OnAdd()
{
// TODO: Add your control notification handler code here
{ //根据numfirst和numsecond和op的值分为5种状态。
if(numfirst!=0 && 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(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(numfirst==0 && numsecond==0)
{ //该状态为程序启动还没有开始录入输入的状态
numfirst=m_Dis; //屏幕的值赋值到numfirst
UpdateData(FALSE);
m_Dis=0;
}
op='+'; //最后记录最后一个操作是+
poz=1;//小数点位置归位
point_flag=FALSE;//默认小数点标志为整数,也就是0,也就是FALSE
}
}
void CCalculatorDlg::OnNeg()
{
// TODO: Add your control notification handler code here
m_Dis=-m_Dis;//换个符号,其他都一样
UpdateData(FALSE);
poz=1;
point_flag=FALSE;
}
void CCalculatorDlg::OnPt()
{
// TODO: Add your control notification handler code here
point_flag=TRUE; //把标志位改为"小数点"状态
}
void CCalculatorDlg::OnBackspace()
{
// TODO: Add your control notification handler code here
//主要通过_gcvt()和strtod()函数进行字符串和浮点数之间的转换
char buffer[30]; //定义个装字符的数组
_gcvt(m_Dis,sizeof(m_Dis),buffer); //把m_Dis存的数字转换为string
for(int i=0;i<30;i++)
{
if(buffer[i]=='.'&& buffer[i+1]==0)//判断是否为整数
{
point_flag=FALSE; //标志位设置为"整数位"
break;
}
}
if(point_flag==TRUE) //如果是小数
{
for(int j=0;j<30;j++)
{
if(buffer[j]==0)
{
buffer[j-1]=0; //把'\0'之前的字符赋值为'\0',就相当于剪掉最后一位
break;
}
}
}
else //如果是整数
{
buffer[i-1]=0; //剪掉'.'之前那位
}
m_Dis=strtod(buffer,NULL);//再用strtod弄成浮点数
UpdateData(FALSE);
poz=1;
}
void CCalculatorDlg::OnCe()
{
// TODO: Add your control notification handler code here
if(numfirst!=0 && numsecond==0)//CE只能修改第二个数字
{
m_Dis=0; //把屏幕的值赋值为0
UpdateData(FALSE);//并显示出来
}
}
void CCalculatorDlg::OnClear()
{
// TODO: Add your control notification handler code here
op=NULL; //清空符号
numfirst=0;//清空第一个数字
numsecond=0;//清空第二个数字
point_flag=FALSE;//改为默认整数位
poz=1;//小数点归位
m_Dis=0;
UpdateData(FALSE); //屏幕显示归0
}
void CCalculatorDlg::OnMin()
{
// TODO: Add your control notification handler code here
{ //根据numfirst和numsecond和op的值分为5种状态。
if(numfirst!=0 && 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(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(numfirst==0 && numsecond==0)
{ //该状态为程序启动还没有开始录入输入的状态
numfirst=m_Dis; //屏幕的值赋值到numfirst
UpdateData(FALSE);
m_Dis=0;
}
op='-'; //最后记录最后一个操作是+
poz=1;//小数点位置归位
point_flag=FALSE;//默认小数点标志为整数,也就是0,也就是FALSE
}
}
void CCalculatorDlg::OnMul()
{
// TODO: Add your control notification handler code here
{ //根据numfirst和numsecond和op的值分为5种状态。
if(numfirst!=0 && 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(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(numfirst==0 && numsecond==0)
{ //该状态为程序启动还没有开始录入输入的状态
numfirst=m_Dis; //屏幕的值赋值到numfirst
UpdateData(FALSE);
m_Dis=0;
}
op='*'; //最后记录最后一个操作是+
poz=1;//小数点位置归位
point_flag=FALSE;//默认小数点标志为整数,也就是0,也就是FALSE
}
}
void CCalculatorDlg::OnDiv()
{
// TODO: Add your control notification handler code here
{ //根据numfirst和numsecond和op的值分为5种状态。
if(numfirst!=0 && 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(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(numfirst==0 && numsecond==0)
{ //该状态为程序启动还没有开始录入输入的状态
numfirst=m_Dis; //屏幕的值赋值到numfirst
UpdateData(FALSE);
m_Dis=0;
}
op='/'; //最后记录最后一个操作是+
poz=1;//小数点位置归位
point_flag=FALSE;//默认小数点标志为整数,也就是0,也就是FALSE
}
}
void CCalculatorDlg::OnEou()
{
// TODO: Add your control notification handler code here
{ //根据numfirst和numsecond和op的值分为5种状态。
if(numfirst!=0 && 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(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(numfirst==0 && numsecond==0)
{ //该状态为程序启动还没有开始录入输入的状态
numfirst=m_Dis; //屏幕的值赋值到numfirst
UpdateData(FALSE);
m_Dis=0;
}
op='='; //最后记录最后一个操作是+
poz=1;//小数点位置归位
point_flag=FALSE;//默认小数点标志为整数,也就是0,也就是FALSE
}
}
总结:
本次MFC计算器的制作,学习到了MFC基本的编程方法,增加了小组开发的团结协作能力。对OOP编程的理解进一步加深。但是程序仍然没存在一定的问题,比如除数不能为0的Exception handle,符号键多次点击结果混乱。由于时间仓促,如果有更多的时间,必定这些问题会迎刃而解。通过这次课程设计,以后Windows 应用程序势必会轻车熟路。
【文件预览】:
caculate
----caculate()
--------caculate.opt(53KB)
--------StdAfx.cpp(210B)
--------resource.h(2KB)
--------caculate.clw(2KB)
--------caculate.aps(23KB)
--------caculate.ncb(97KB)
--------caculateDlg.h(2KB)
--------caculate.rc(7KB)
--------caculate.plg(1KB)
--------Debug()
--------ReadMe.txt(4KB)
--------StdAfx.h(1KB)
--------caculateDlg.cpp(11KB)
--------caculate.cpp(2KB)
--------Release()
--------caculate.h(1KB)
--------res()
--------caculate.dsw(524B)
--------caculate.dsp(4KB)
网友评论
- 谢谢楼主分享,可以用。
- 可以运行,界面稍微简单 但对于初学者帮助很大
- 能用,但是,作为小白,还是感觉有点复杂
- 还好吧,我其实想要一个,可以计算一个式子的计算器,单个符号的我也会写啊!
- 可以运行,界面稍微简单 但对于初学者帮助很大
- 还行 比较简单,对新手挺有帮助的
- 实验用的就是这份 很好
- 挺好的,能运行
- 很不错的计算器,对我帮助很大。
- 很好的程序,对MFC学习很有帮助
- 能运行,暂时还没发现漏洞,打算用作参考。
- 还不错,我用着挺舒服的
- 我觉得还行,但是对于优先级 以及栈。。
- 很好,可以通过源码来学习编程。
- 界面比较友好,适合当模板,去模仿使用
- 有bug 不过还是谢谢啦 分享有爱
- 还不错,修改一下更好
- 有一些bug,还行吧
- 一般般咯,不能连续加减
- 需要稍微修改一下才能使用 总体来说挺好的