MFC实现简单功能计算器

来源:互联网 发布:企业淘宝需要什么证件 编辑:程序博客网 时间:2024/05/18 04:00

MFC实现简单功能计算器
作者:天涯 来源:中国自学编程网 发布日期:1229305098 
 
第一步:利用MFC的AppWizard生成一个基于对话框的程序(本程序工程名为Calc),切换到Resource ,在Dialog中的IDD_CALC_DIALOG上双击,然后添控件按钮,做好外观布局,改好按钮ID和Caption;

第二步:为控件按钮增加相应的变量和事件响应函数;

第三步:在CCalcDlg类中添加相应变量;

第四步:对控件按钮的事件响应函数做处理;

 

代码如下:

 

第一部分(利用ClassWizard添加,可不必手动修改),在CalcDlg.h中的代码修改如下:

// CalcDlg.h : 头文件
//

#pragma once


// CCalcDlg 对话框
class CCalcDlg : public CDialog
{
// 构造
public:
CCalcDlg(CWnd* pParent = NULL); // 标准构造函数

// 对话框数据
enum { IDD = IDD_CALC_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:
afx_msg void OnBnClickedBtnnum0();
public:
afx_msg void OnBnClickedBtnnum1();
public:
afx_msg void OnBnClickedBtnnum2();
public:
afx_msg void OnBnClickedBtnnum3();
public:
afx_msg void OnBnClickedBtnnum4();
public:
afx_msg void OnBnClickedBtnnum5();
public:
afx_msg void OnBnClickedBtnnum6();
public:
afx_msg void OnBnClickedBtnnum7();
public:
afx_msg void OnBnClickedBtnnum8();
public:
afx_msg void OnBnClickedBtnnum9();
public:
afx_msg void OnBnClickedBtnopadd();
public:
afx_msg void OnBnClickedBtnopsub();
public:
afx_msg void OnBnClickedBtnopmulti();
public:
afx_msg void OnBnClickedBtnopdiv();
public:
afx_msg void OnBnClickedBtnopequal();
public:
afx_msg void OnBnClickedBtnclean();
public:
afx_msg void OnBnClickedBtnnumradix();

protected:
CString m_csEditText; //保存运算符右操作数的字符串,按下运算符按钮时将其赋给m_csFirstNumber,

//然后清空,从 新接收数字
CString m_csFirstNumber; //用来保存运算符的左操作数的字符串
bool m_bRadixFlag; //小数点标志,用来确保一个数字中只包含一个小数点
double m_dFirstNumber; //用来保存从m_csFirstNumber中提取出来的浮点数
double m_dSecondNumber; //用来保存按下运算符按钮更新后的m_csEditText所包含的浮点数字
double m_dResualt; //用来保存运算结果的浮点数
int m_nOperatorFlag; //用来标志运算符
char m_cInsetNumber; //用来保存按下数字按钮时的相应数字,然后把它动态加入到m_csEditText中,构成新数字字符串
};

 

第二部分,在CalcDlg.cpp中修改代码如下:

 

// CalcDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "Calc.h"
#include "CalcDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialog
{
public:
CAboutDlg();

// 对话框数据
enum { IDD = IDD_ABOUTBOX };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

// 实现
protected:
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CCalcDlg 对话框

 


CCalcDlg::CCalcDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCalcDlg::IDD, pParent)
, m_csEditText(_T(""))
, m_csFirstNumber(_T(""))
, m_bRadixFlag(false)
, m_dFirstNumber(0)
, m_dSecondNumber(0)
, m_dResualt(0)
, m_nOperatorFlag(0)
, m_cInsetNumber(0)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CCalcDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT, m_csEditText);
}

BEGIN_MESSAGE_MAP(CCalcDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BTNNUM0, &CCalcDlg::OnBnClickedBtnnum0)
ON_BN_CLICKED(IDC_BTNNUM1, &CCalcDlg::OnBnClickedBtnnum1)
ON_BN_CLICKED(IDC_BTNNUM2, &CCalcDlg::OnBnClickedBtnnum2)
ON_BN_CLICKED(IDC_BTNNUM3, &CCalcDlg::OnBnClickedBtnnum3)
ON_BN_CLICKED(IDC_BTNNUM4, &CCalcDlg::OnBnClickedBtnnum4)
ON_BN_CLICKED(IDC_BTNNUM5, &CCalcDlg::OnBnClickedBtnnum5)
ON_BN_CLICKED(IDC_BTNNUM6, &CCalcDlg::OnBnClickedBtnnum6)
ON_BN_CLICKED(IDC_BTNNUM7, &CCalcDlg::OnBnClickedBtnnum7)
ON_BN_CLICKED(IDC_BTNNUM8, &CCalcDlg::OnBnClickedBtnnum8)

ON_BN_CLICKED(IDC_BTNNUM9, &CCalcDlg::OnBnClickedBtnnum9)
ON_BN_CLICKED(IDC_BTNNUMRADIX, &CCalcDlg::OnBnClickedBtnnumradix)
ON_BN_CLICKED(IDC_BTNOPADD, &CCalcDlg::OnBnClickedBtnopadd)
ON_BN_CLICKED(IDC_BTNOPSUB, &CCalcDlg::OnBnClickedBtnopsub)
ON_BN_CLICKED(IDC_BTNOPMULTI, &CCalcDlg::OnBnClickedBtnopmulti)
ON_BN_CLICKED(IDC_BTNOPDIV, &CCalcDlg::OnBnClickedBtnopdiv)
ON_BN_CLICKED(IDC_BTNOPEQUAL, &CCalcDlg::OnBnClickedBtnopequal)
ON_BN_CLICKED(IDC_BTNCLEAN, &CCalcDlg::OnBnClickedBtnclean)
END_MESSAGE_MAP()


// CCalcDlg 消息处理程序

BOOL CCalcDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// 将“关于...”菜单项添加到系统菜单中。

// IDM_ABOUTBOX 必须在系统命令范围内。
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);
}
}

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标

// TODO: 在此添加额外的初始化代码

return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}

void CCalcDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。

void CCalcDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作矩形中居中
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;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。
//
HCURSOR CCalcDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}


void CCalcDlg::OnBnClickedBtnnum0()
{
// TODO: Add your control notification handler code here
m_cInsetNumber='0';
UpdateData();
m_csEditText+=m_cInsetNumber;
UpdateData(FALSE);
}

void CCalcDlg::OnBnClickedBtnnum1()
{
// TODO: Add your control notification handler code here
m_cInsetNumber='1';
UpdateData();
m_csEditText+=m_cInsetNumber;
UpdateData(FALSE);
}

void CCalcDlg::OnBnClickedBtnnum2()
{
// TODO: Add your control notification handler code here
m_cInsetNumber='2';
UpdateData();
m_csEditText+=m_cInsetNumber;
UpdateData(FALSE);
}

void CCalcDlg::OnBnClickedBtnnum3()
{
// TODO: Add your control notification handler code here
m_cInsetNumber='3';
UpdateData();
m_csEditText+=m_cInsetNumber;
UpdateData(FALSE);
}

void CCalcDlg::OnBnClickedBtnnum4()
{
// TODO: Add your control notification handler code here
m_cInsetNumber='4';
UpdateData();
m_csEditText+=m_cInsetNumber;
UpdateData(FALSE);
}

void CCalcDlg::OnBnClickedBtnnum5()
{
// TODO: Add your control notification handler code here
m_cInsetNumber='5';
UpdateData();
m_csEditText+=m_cInsetNumber;
UpdateData(FALSE);
}

void CCalcDlg::OnBnClickedBtnnum6()
{
// TODO: Add your control notification handler code here
m_cInsetNumber='6';
UpdateData();
m_csEditText+=m_cInsetNumber;
UpdateData(FALSE);
}

void CCalcDlg::OnBnClickedBtnnum7()
{
// TODO: Add your control notification handler code here
m_cInsetNumber='7';
UpdateData();
m_csEditText+=m_cInsetNumber;
UpdateData(FALSE);
}

void CCalcDlg::OnBnClickedBtnnum8()
{
// TODO: Add your control notification handler code here
m_cInsetNumber='8';
UpdateData();
m_csEditText+=m_cInsetNumber;
UpdateData(FALSE);
}

void CCalcDlg::OnBnClickedBtnnum9()
{
// TODO: Add your control notification handler code here
m_cInsetNumber='9';
UpdateData();
m_csEditText+=m_cInsetNumber;
UpdateData(FALSE);

}

void CCalcDlg::OnBnClickedBtnnumradix()
{
// TODO: Add your control notification handler code here
if(m_bRadixFlag==FALSE)
{
m_cInsetNumber='.';
UpdateData();
m_csEditText+=m_cInsetNumber;
UpdateData(FALSE);
m_bRadixFlag=TRUE;
}
else
UpdateData(FALSE);
}

void CCalcDlg::OnBnClickedBtnopadd()
{
// TODO: Add your control notification handler code here
m_nOperatorFlag=1;
m_bRadixFlag=FALSE;
m_csFirstNumber=m_csEditText;
m_csEditText.Empty();
UpdateData(FALSE);
}

void CCalcDlg::OnBnClickedBtnopsub()
{
// TODO: Add your control notification handler code here
m_nOperatorFlag=2;
m_bRadixFlag=FALSE;
m_csFirstNumber=m_csEditText;
m_csEditText.Empty();
UpdateData(FALSE);
}

void CCalcDlg::OnBnClickedBtnopmulti()
{
// TODO: Add your control notification handler code here
m_nOperatorFlag=3;
m_bRadixFlag=FALSE;
m_csFirstNumber=m_csEditText;
m_csEditText.Empty();
UpdateData(FALSE);
}

void CCalcDlg::OnBnClickedBtnopdiv()
{
// TODO: Add your control notification handler code here
m_nOperatorFlag=4;
m_bRadixFlag=FALSE;
m_csFirstNumber=m_csEditText;
m_csEditText.Empty();
UpdateData(FALSE);
}

void CCalcDlg::OnBnClickedBtnopequal()
{
// TODO: Add your control notification handler code here
double number1;
double number2;
number1=_wtof(m_csFirstNumber);
number2=_wtof(m_csEditText);

switch(m_nOperatorFlag)
{
case 1:
m_dResualt=number1+number2;
m_csEditText.Format(_T("%f"),m_dResualt);
UpdateData(FALSE);
m_nOperatorFlag=0;
break;
case 2:
m_dResualt=number1-number2;
m_csEditText.Format(_T("%f"),m_dResualt);
UpdateData(FALSE);
m_nOperatorFlag=0;
break;
case 3:
m_dResualt=number1*number2;
m_csEditText.Format(_T("%f"),m_dResualt);
UpdateData(FALSE);
m_nOperatorFlag=0;
break;
case 4:
m_dResualt=number1/number2;
m_csEditText.Format(_T("%f"),m_dResualt);
UpdateData(FALSE);
m_nOperatorFlag=0;
break;
default:
{
UpdateData();
UpdateData(FALSE);
}
}
}

void CCalcDlg::OnBnClickedBtnclean()
{
// TODO: Add your control notification handler code here
UpdateData();
m_csEditText.Empty();
m_csFirstNumber.Empty();
UpdateData(FALSE);
}
ok了,可以运行。以上黑体部分是修改的代码;本程序中Visual C++2005中编译

原创粉丝点击