程序综合设计 MFC写简单的计算器

自己写这个也花了不少时间,当时做的时候在网上找了一些,不过很是不满意。给大家分享一些我做的,有一些bug,大家可以自己试着改一下。比如我用的cstring做的,按下等于后再按数字键它不会清零。1+1=2,再按1变成21.
环境vs2013。
大致界面
改图标什么的网上应该有,我就不放了。
然后底下就是直接放代码:
`//头文件代码

// MyCalculateDlg.h : 头文件
//

#pragma once
#include “afxwin.h”

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

// 对话框数据
enum { IDD = IDD_MYCALCULATE_DIALOG };
//0 代表+ 1代表- 2代表* 3代表÷
int flag_num = -1;
void SaveFirstValue();
void Calculator();
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 OnBnClickedButton4();
afx_msg void OnBnClickedButton3();

private:
CString m_value;
//m_value是创建框框时,右键添加变量,然后类别control改成value
//起名m_value
double num1 = 0;
double num2 = 0;
这两个全局变量,保存数据的。
//CALCULATOR_FLAG mFlag;
public:
afx_msg void OnBnClickedButton15();
afx_msg void OnBnClickedButton14();
afx_msg void OnBnClickedButton16();
afx_msg void OnBnClickedButton11();
afx_msg void OnBnClickedButton10();
afx_msg void OnBnClickedButton12();
afx_msg void OnBnClickedButton7();
afx_msg void OnBnClickedButton6();
afx_msg void OnBnClickedButton8();
afx_msg void OnBnClickedButton5();
afx_msg void OnBnClickedButton19();
afx_msg void OnBnClickedButton18();
afx_msg void OnBnClickedButton9();
afx_msg void OnBnClickedButton13();
afx_msg void OnBnClickedButton17();
afx_msg void OnBnClickedButton21();
afx_msg void OnBnClickedButton2();
afx_msg void OnBnClickedButton20();
afx_msg void OnBnClickedButton22();
afx_msg void OnBnClickedButton1();
afx_msg void OnBnClickedButton23();
afx_msg void OnBnClickedButton24();
};
底下就是cpp的代码:

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

#include “stdafx.h”
#include “MyCalculate.h”
#include “MyCalculateDlg.h”
#include “afxdialogex.h”
#include
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

int buttom = -1;
//因为连着按两次等于会出现bug,所以做一个开关
//判断是否按过某按钮
//bool flag = false;
//判断第一次按过某按钮
bool first_flag = false;
// 用于应用程序“关于”菜单项的 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()

// CMyCalculateDlg 对话框

CMyCalculateDlg::CMyCalculateDlg(CWnd* pParent / =NULL/)
CDialogEx(CMyCalculateDlg::IDD, pParent)
, m_value(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);

/这里就是我说的改图标的代码部分/

}

void CMyCalculateDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_value);
}

BEGIN_MESSAGE_MAP(CMyCalculateDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON4, &CMyCalculateDlg::OnBnClickedButton4)
ON_BN_CLICKED(IDC_BUTTON3, &CMyCalculateDlg::OnBnClickedButton3)
ON_BN_CLICKED(IDC_BUTTON15, &CMyCalculateDlg::OnBnClickedButton15)
ON_BN_CLICKED(IDC_BUTTON14, &CMyCalculateDlg::OnBnClickedButton14)
ON_BN_CLICKED(IDC_BUTTON16, &CMyCalculateDlg::OnBnClickedButton16)
ON_BN_CLICKED(IDC_BUTTON11, &CMyCalculateDlg::OnBnClickedButton11)
ON_BN_CLICKED(IDC_BUTTON10, &CMyCalculateDlg::OnBnClickedButton10)
ON_BN_CLICKED(IDC_BUTTON12, &CMyCalculateDlg::OnBnClickedButton12)
ON_BN_CLICKED(IDC_BUTTON7, &CMyCalculateDlg::OnBnClickedButton7)
ON_BN_CLICKED(IDC_BUTTON6, &CMyCalculateDlg::OnBnClickedButton6)
ON_BN_CLICKED(IDC_BUTTON8, &CMyCalculateDlg::OnBnClickedButton8)
ON_BN_CLICKED(IDC_BUTTON5, &CMyCalculateDlg::OnBnClickedButton5)
ON_BN_CLICKED(IDC_BUTTON19, &CMyCalculateDlg::OnBnClickedButton19)
ON_BN_CLICKED(IDC_BUTTON18, &CMyCalculateDlg::OnBnClickedButton18)
ON_BN_CLICKED(IDC_BUTTON9, &CMyCalculateDlg::OnBnClickedButton9)
ON_BN_CLICKED(IDC_BUTTON13, &CMyCalculateDlg::OnBnClickedButton13)
ON_BN_CLICKED(IDC_BUTTON17, &CMyCalculateDlg::OnBnClickedButton17)
ON_BN_CLICKED(IDC_BUTTON21, &CMyCalculateDlg::OnBnClickedButton21)
ON_BN_CLICKED(IDC_BUTTON2, &CMyCalculateDlg::OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON20, &CMyCalculateDlg::OnBnClickedButton20)
ON_BN_CLICKED(IDC_BUTTON22, &CMyCalculateDlg::OnBnClickedButton22)
ON_BN_CLICKED(IDC_BUTTON1, &CMyCalculateDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON23, &CMyCalculateDlg::OnBnClickedButton23)
ON_BN_CLICKED(IDC_BUTTON24, &CMyCalculateDlg::OnBnClickedButton24)
END_MESSAGE_MAP()

// CMyCalculateDlg 消息处理程序

BOOL CMyCalculateDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

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

// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
	BOOL bNameValid;
	CString strAboutMenu;
	bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
	ASSERT(bNameValid);
	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 CMyCalculateDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}

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

void CMyCalculateDlg::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
{
	CDialogEx::OnPaint();
}

}

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

//退格
void CMyCalculateDlg::OnBnClickedButton4()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
if (!m_value.IsEmpty())
{
m_value = m_value.Left(m_value.GetLength() - 1);
}
UpdateData(false);
}

//开方
void CMyCalculateDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
num1 = _wtof(m_value);
double f = sqrt(num1);
if (f - (int)f <= 1e-5)
{
m_value.Format(L"%d", (int)f);
}
else
{
m_value.Format(L"%f", f);
}
UpdateData(false);
}

//数字1
void CMyCalculateDlg::OnBnClickedButton15()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
m_value += L"1";
UpdateData(false);
buttom = 0;
}

//2
void CMyCalculateDlg::OnBnClickedButton14()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
m_value += L"2";
UpdateData(false);
buttom = 0;
}

//3
void CMyCalculateDlg::OnBnClickedButton16()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
m_value += L"3";
UpdateData(false);
buttom = 0;
}

//4
void CMyCalculateDlg::OnBnClickedButton11()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
m_value += L"4";
UpdateData(false);
buttom = 0;
}

//5
void CMyCalculateDlg::OnBnClickedButton10()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
m_value += L"5";
UpdateData(false);
buttom = 0;
}

//6
void CMyCalculateDlg::OnBnClickedButton12()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
m_value += L"6";
UpdateData(false);
buttom = 0;
}

//7
void CMyCalculateDlg::OnBnClickedButton7()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
m_value += L"7";
UpdateData(false);
buttom = 0;
}

//8
void CMyCalculateDlg::OnBnClickedButton6()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
m_value += L"8";
UpdateData(false);
buttom = 0;
}

//9
void CMyCalculateDlg::OnBnClickedButton8()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
m_value += L"9";
UpdateData(false);
buttom = 0;
}

//归零
void CMyCalculateDlg::OnBnClickedButton5()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
m_value = L"";
flag_num = -1;
num1 = 0;
num2 = 0;
first_flag = false;
UpdateData(false);
buttom = 0;
}

//0
void CMyCalculateDlg::OnBnClickedButton19()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
m_value += L"0";
UpdateData(false);
buttom = 0;
}

//小数点
void CMyCalculateDlg::OnBnClickedButton18()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
//如果没有小数点就加上小数点,如果有就忽略
if (-1 == m_value.Find(L’.’))
{
m_value += L".";
}
UpdateData(false);
}
void CMyCalculateDlg::SaveFirstValue()
{
UpdateData(true);
num1 = _wtof(m_value);
m_value = L"";
UpdateData(false);
}

// ++++++
void CMyCalculateDlg::OnBnClickedButton9()
{
// TODO: 在此添加控件通知处理程序代码
if (first_flag != false)
{
OnBnClickedButton20();
}
UpdateData(true);
SaveFirstValue();
flag_num = 0;
first_flag = true;
}

// ------
void CMyCalculateDlg::OnBnClickedButton13()
{
// TODO: 在此添加控件通知处理程序代码
if (first_flag != false)
{
OnBnClickedButton20();
}
UpdateData(true);
SaveFirstValue();
flag_num = 1;
first_flag = true;

}

// ******
void CMyCalculateDlg::OnBnClickedButton17()
{
// TODO: 在此添加控件通知处理程序代码
//flag = false;
if (first_flag != false)
{
OnBnClickedButton20();
}
UpdateData(true);
SaveFirstValue();
flag_num = 2;
first_flag = true;

}

// 除法
void CMyCalculateDlg::OnBnClickedButton21()
{
// TODO: 在此添加控件通知处理程序代码

if (first_flag != false)
{
	OnBnClickedButton20();
}
UpdateData(true);
SaveFirstValue();
flag_num = 3;
first_flag = true;

}

//平方
void CMyCalculateDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
num1 = _wtof(m_value);
double f = num1 * num1;
if (f - (int)f <= 1e-5)
{
m_value.Format(L"%d",(int)f);
}
else
{
m_value.Format(L"%f",f);
}
UpdateData(false);
}

// =======
void CMyCalculateDlg::OnBnClickedButton20()
{
// TODO: 在此添加控件通知处理程序代码
if (flag_num != 0 && flag_num != 1 && flag_num != 2 && flag_num != 3)
{
flag_num = _wtof(m_value);
}
else
Calculator();
UpdateData(false);
}

void CMyCalculateDlg::Calculator()
{

UpdateData(true);
num2 = _wtof(m_value);



if (buttom == 0)
{
	double result = 0.0f;
	switch (flag_num)
	{
	case 0:
		result = num1 + num2;
		break;
	case 1:
		result = num1 - num2;
		break;
	case 2:
		result = num1 * num2;
		break;
	case 3:
		if (num2 == 0.0f)
		{
			MessageBox(_T("错误"));
			result = num1;
		}
		else
		{
			result = num1 / num2;
		}
		break;
	default:
		break;
	}

	//如果浮点数是整数
	if (result - int(result) <= 1e-5)
	{
		m_value.Format(L"%d", (int)result);
	}
	else
	{
		m_value.Format(L"%f", result);
	}
}
	UpdateData(false);
	buttom = 1;

}

void CMyCalculateDlg::OnBnClickedButton22()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
num1 = _wtof(m_value);
double f = sin(num1);
if (f - (int)f <= 1e-5)
{
m_value.Format(L"%d", (int)f);
}
else
{
m_value.Format(L"%f", f);
}
UpdateData(false);
}

//cos
void CMyCalculateDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
num1 = _wtof(m_value);
double f = cos(num1);
if (f - (int)f <= 1e-5)
{
m_value.Format(L"%d", (int)f);
}
else
{
m_value.Format(L"%f", f);
}
UpdateData(false);
}

// tan
void CMyCalculateDlg::OnBnClickedButton23()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
num1 = _wtof(m_value);
double f = tan(num1);
if (f - (int)f <= 1e-5)
{
m_value.Format(L"%d", (int)f);
}
else
{
m_value.Format(L"%f", f);
}
UpdateData(false);

}

//倒数
void CMyCalculateDlg::OnBnClickedButton24()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
num1 = _wtof(m_value);
double f = 1/num1;
if (f - (int)f <= 1e-5)
{
m_value.Format(L"%d", (int)f);
}
else
{
m_value.Format(L"%f", f);
}
UpdateData(false);
}

`

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值