⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calculatordlg.cpp

📁 Wince 下的计算器的源代码,适合PMP下的计算器配套软件.
💻 CPP
字号:
// CalculatorDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Calculator.h"
#include "BitmapBtn.h"
#include "CalculatorDlg.h"
#include <math.h>



#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif



#define OPERATOR_NULL 0
#define OPERATOR_ADD  1
#define OPERATOR_SUB  2
#define OPERATOR_MUL  3
#define OPERATOR_DIV  4
#define OPERATOR_POW  5
#define PI			  3.1415926535897932384626433832795
#define RADIAN		  0 //弧度
#define ANGLE		  1 //角度
/////////////////////////////////////////////////////////////////////////////
// CCalculatorDlg dialog

CCalculatorDlg::CCalculatorDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CCalculatorDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CCalculatorDlg)
	m_result = 0.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_Control(pDX, IDC_X, m_x);
	DDX_Control(pDX, IDC_FACTORIAL, m_factorial);
	DDX_Control(pDX, IDC_ADD, m_add);
	DDX_Control(pDX, IDC_TAN, m_tan);
	DDX_Control(pDX, IDC_SUB, m_sub);
	DDX_Control(pDX, IDC_SQRT, m_sqrt);
	DDX_Control(pDX, IDC_SIN, m_sin);
	DDX_Control(pDX, IDC_SIGN, m_sign);
	DDX_Control(pDX, IDC_POW, m_pow);
	DDX_Control(pDX, IDC_PI, m_pi);
	DDX_Control(pDX, IDC_MUL, m_mul);
	DDX_Control(pDX, IDC_LOG, m_log);
	DDX_Control(pDX, IDC_LN, m_ln);
	DDX_Control(pDX, IDC_EQU, m_equ);
	DDX_Control(pDX, IDC_DOT, m_dot);
	DDX_Control(pDX, IDC_DIV, m_div);
	DDX_Control(pDX, IDC_COS, m_cos);
	DDX_Control(pDX, IDC_CLEAR, m_clear);
	DDX_Control(pDX, IDC_BUTTON9, m_no9);
	DDX_Control(pDX, IDC_BUTTON8, m_no8);
	DDX_Control(pDX, IDC_BUTTON7, m_no7);
	DDX_Control(pDX, IDC_BUTTON6, m_no6);
	DDX_Control(pDX, IDC_BUTTON5, m_no5);
	DDX_Control(pDX, IDC_BUTTON4, m_no4);
	DDX_Control(pDX, IDC_BUTTON3, m_no3);
	DDX_Control(pDX, IDC_BUTTON2, m_no2);
	DDX_Control(pDX, IDC_BUTTON1, m_no1);
	DDX_Control(pDX, IDC_BUTTON0, m_no0);
	DDX_Text(pDX, IDC_EDIT1, m_result);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CCalculatorDlg, CDialog)
	//{{AFX_MSG_MAP(CCalculatorDlg)
	ON_BN_CLICKED(IDC_DOT, OnDot)
	ON_BN_CLICKED(IDC_ADD, OnAdd)
	ON_BN_CLICKED(IDC_SUB, OnSub)
	ON_BN_CLICKED(IDC_DIV, OnDiv)
	ON_BN_CLICKED(IDC_MUL, OnMul)
	ON_BN_CLICKED(IDC_EQU, OnEqu)
	ON_BN_CLICKED(IDC_CLEAR, OnClear)
	ON_BN_CLICKED(IDC_SQRT, OnSqrt)
	ON_BN_CLICKED(IDC_X, OnX)
	ON_BN_CLICKED(IDC_SIGN, OnSign)
	ON_BN_CLICKED(IDC_SIN, OnSin)
	ON_BN_CLICKED(IDC_PI, OnPi)
	ON_BN_CLICKED(IDC_COS, OnCos)
	ON_BN_CLICKED(IDC_TAN, OnTan)
	ON_BN_CLICKED(IDC_LOG, OnLog)
	ON_BN_CLICKED(IDC_POW, OnPow)
	ON_BN_CLICKED(IDC_LN, OnLn)
	ON_BN_CLICKED(IDC_FACTORIAL, OnFactorial)
	ON_BN_CLICKED(IDC_RADIAN, OnRadianAngle)
	ON_WM_PAINT()
	//}}AFX_MSG_MAP
	ON_COMMAND_RANGE(IDC_BUTTON0,IDC_BUTTON9, OnNum)
	ON_COMMAND_RANGE(IDC_TEST,IDC_ANGLE, OnRadianAngle)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCalculatorDlg message handlers

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

	// 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
	
	CenterWindow(GetDesktopWindow());	// center to the hpc screen

	// TODO: Add extra initialization here
	m_bDotFlag = FALSE;
	m_nAfterDotCount = 0;
	m_dFirstNum = m_dSecondNum = 0.0;
	m_nOperator = OPERATOR_NULL;

	m_nRadianFlag = ANGLE;

CRect rect;
GetClientRect(&rect);
	Onequal() ;

	m_tan.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,	IDB_BITMAP2,IDB_BITMAP3,2,0,0);
	m_sub.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,	IDB_BITMAP2,IDB_BITMAP3,2,0,0);
	m_sqrt.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,IDB_BITMAP2,IDB_BITMAP3,2,0,0);
	m_sin.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,	IDB_BITMAP2,IDB_BITMAP3,2,0,0);
	m_sign.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,	IDB_BITMAP2,IDB_BITMAP3,2,0,0);
	m_pow.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,	IDB_BITMAP2,IDB_BITMAP3,2,0,0);
	m_pi.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,	IDB_BITMAP2,IDB_BITMAP3,2,0,0);
	m_mul.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,	IDB_BITMAP2,IDB_BITMAP3,2,0,0);
	m_log.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,	IDB_BITMAP2,IDB_BITMAP3,2,0,0);
	m_ln.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,	IDB_BITMAP2,IDB_BITMAP3,2,0,0);
	m_equ.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,	IDB_BITMAP2,IDB_BITMAP3,2,0,0);
	m_dot.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,	IDB_BITMAP2,IDB_BITMAP3,2,0,0);
	m_div.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,	IDB_BITMAP2,IDB_BITMAP3,2,0,0);
	m_cos.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,	IDB_BITMAP2,IDB_BITMAP3,2,0,0);
	m_clear.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,IDB_BITMAP2,IDB_BITMAP3,2,0,0);
	m_no9.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,	IDB_BITMAP2,IDB_BITMAP3,2,0,0);
	m_no8.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,	IDB_BITMAP2,IDB_BITMAP3,2,0,0);

	m_no7.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,	IDB_BITMAP2,IDB_BITMAP3,2,0,0);
	m_no6.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,	IDB_BITMAP2,IDB_BITMAP3,2,0,0);
	m_no5.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,	IDB_BITMAP2,IDB_BITMAP3,2,0,0);
	m_no4.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,	IDB_BITMAP2,IDB_BITMAP3,2,0,0);
	m_no3.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,	IDB_BITMAP2,IDB_BITMAP3,2,0,0);
	m_no2.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,	IDB_BITMAP2,IDB_BITMAP3,2,0,0);
	m_no1.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,	IDB_BITMAP2,IDB_BITMAP3,2,0,0);
	m_no0.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,	IDB_BITMAP2,IDB_BITMAP3,2,0,0);

	m_x.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,	IDB_BITMAP2,IDB_BITMAP3,2,0,0);
	m_factorial.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,	IDB_BITMAP2,IDB_BITMAP3,2,0,0);
	m_add.SetSkin(IDB_BITMAP1,IDB_BITMAP3, IDB_BITMAP1,IDB_BITMAP1,IDB_BITMAP2,	IDB_BITMAP2,IDB_BITMAP3,2,0,0);
 

	return TRUE;  // return TRUE  unless you set the focus to a control
}



void CCalculatorDlg::OnNum(UINT id) 
{
	Onequal() ;
	int keynum = id - IDC_BUTTON0; 
	if (!m_bDotFlag)
	{
		m_result = (m_result * 10) + keynum;
	}
	else
	{
		m_nAfterDotCount++;
		m_result += (keynum * pow(0.1,m_nAfterDotCount));
	}
	UpdateData(FALSE);
}

void CCalculatorDlg::OnDot() 
{
	// TODO: Add your control notification handler code here
	m_bDotFlag = TRUE;
}

void CCalculatorDlg::OnAdd() 
{
	// TODO: Add your control notification handler code here
	m_dFirstNum = m_result;
	m_nOperator = OPERATOR_ADD;
	m_result = 0.0;
	m_nAfterDotCount = 0;
	m_bDotFlag = FALSE;
}

void CCalculatorDlg::OnSub() 
{
	// TODO: Add your control notification handler code here
	m_dFirstNum = m_result;
	m_nOperator = OPERATOR_SUB;	
	m_result = 0.0;
	m_nAfterDotCount = 0;
	m_bDotFlag = FALSE;
}

void CCalculatorDlg::OnDiv() 
{
	// TODO: Add your control notification handler code here
	m_dFirstNum = m_result;
	m_nOperator = OPERATOR_DIV;	
	m_result = 0.0;
	m_nAfterDotCount = 0;
	m_bDotFlag = FALSE;
}


//乘法
void CCalculatorDlg::OnMul() 
{
	// TODO: Add your control notification handler code here
	m_dFirstNum = m_result;
	m_nOperator = OPERATOR_MUL;	
	m_result = 0.0;
	m_nAfterDotCount = 0;
	m_bDotFlag = FALSE;
}

void CCalculatorDlg::OnEqu() 
{
	// TODO: Add your control notification handler code here
	m_dSecondNum = m_result;
	switch(m_nOperator)
	{
	case OPERATOR_ADD:
		m_result = m_dFirstNum + m_dSecondNum;
		break;
	case OPERATOR_SUB:
		m_result = m_dFirstNum - m_dSecondNum;
		break;
	case OPERATOR_MUL:
		m_result = m_dFirstNum * m_dSecondNum;
		break;
	case OPERATOR_DIV:
		m_result = m_dFirstNum / m_dSecondNum;
		break;
	case OPERATOR_POW:   //开方
		m_result = pow (m_dFirstNum, m_dSecondNum);
		break;
	default:
		break;
	}
	m_equal=true;
	UpdateData(FALSE);
}


//清除屏幕
void CCalculatorDlg::OnClear() 
{
	// TODO: Add your control notification handler code here
	m_result = 0;
	m_dFirstNum = 0;
	m_dSecondNum = 0;

	m_nAfterDotCount = 0;
	m_bDotFlag = FALSE;
	UpdateData(FALSE);
}


//开平方 sqrt
void CCalculatorDlg::OnSqrt() 
{
	// TODO: Add your control notification handler code here
	Onequal() ;
	m_result = sqrt(m_result);
	UpdateData(FALSE);
	m_equal=true;
}

//求倒数 1/x
void CCalculatorDlg::OnX() 
{
	// TODO: Add your control notification handler code here
	Onequal() ;
	m_result = 1.0 / m_result;
	UpdateData(FALSE);
	m_equal=true;
}

//取反
void CCalculatorDlg::OnSign() 
{
	// TODO: Add your control notification handler code here
	//Onequal() ;
	m_result = (-1) * m_result;
	UpdateData(FALSE);
	m_equal=true;
}




void CCalculatorDlg::OnPi() 
{
	Onequal() ;
	m_result = PI;
	UpdateData(FALSE);
}
void CCalculatorDlg::Onequal()  
{
	if(m_equal)OnClear() ;
	m_equal=false;
}

void CCalculatorDlg::OnRadianAngle(UINT id) 
{
}

//求正弦  sin
void CCalculatorDlg::OnSin() 
{
	Onequal() ;

	m_result = sin(PI*m_result/180);

	if (((m_result>0)&&(m_result<0.00000000001))||((m_result<0)&&(m_result>-0.00000000001)))
	{
		m_result = 0;
	}
	UpdateData(FALSE);
	m_equal=true;
}
//求 cos  cos
void CCalculatorDlg::OnCos() 
{
	Onequal() ;
	m_result = cos(PI*m_result/180);


	if (((m_result>0)&&(m_result<0.00000000001))||((m_result<0)&&(m_result>-0.00000000001)))
	{
		m_result = 0;
	}
	UpdateData(FALSE);
	m_equal=true;
}
//求tan  tan
void CCalculatorDlg::OnTan() 
{
	Onequal() ;
	m_result = tan(PI*m_result/180);
	if(m_result>100000000000000)
	{
		int x = 0;
		m_result = 1.0/x;
	}
	if (((m_result>0)&&(m_result<0.00000000001))||((m_result<0)&&(m_result>-0.00000000001)))
	{
		m_result = 0;
	}
	UpdateData(FALSE);
	m_equal=true;
}


//log  log
void CCalculatorDlg::OnLog() 
{
	Onequal() ;
	m_result = log10 (m_result);
	UpdateData(FALSE);
	m_equal=true;
}

void CCalculatorDlg::OnPow() 
{
	Onequal() ;
	m_dFirstNum = m_result;
	m_nOperator = OPERATOR_POW;
	m_result = 0.0;
	m_nAfterDotCount = 0;
	m_bDotFlag = FALSE;
//	UpdateData(FALSE);
}


//求log
void CCalculatorDlg::OnLn() 
{
	Onequal() ;
	m_result = log (m_result);
	UpdateData(FALSE);
	m_equal=true;
}


//求n!
void CCalculatorDlg::OnFactorial() 
{
	// TODO: Add your control notification handler code here
	Onequal() ;
	__int64  i = (__int64)m_result;
	__int64  j = i;
	while (i>1)
	{
		j = j * (i-1);
		i--;
	}
	m_result = j;
	if (((m_result>0)&&(m_result<0.00000000001))||((m_result<0)&&(m_result>-0.00000000001)))
	{
		m_result = 0;
	}
	UpdateData(FALSE);
	m_equal=true;
}

void CCalculatorDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	HBITMAP CBm1;
	  HINSTANCE hInst = AfxGetInstanceHandle();
	  CBm1=(HBITMAP)LoadImage(hInst, MAKEINTRESOURCE(IDB_BITMAP4), IMAGE_BITMAP, 0, 0, 0);
	  LoadBitMapWH(GetDC()->m_hDC,0,0,0,0,211,159,CBm1,NULL,1);
	  DeleteObject(CBm1);
	  
	// Do not call CDialog::OnPaint() for painting messages
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -