📄 calculatordlg.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 + -