home *** CD-ROM | disk | FTP | other *** search
- // calcdial.cpp : implementation file
- //
-
- #include "stdafx.h"
- #include "MyCalc.h"
- #include "calcdial.h"
- #include "integrate.h"
-
- #define NO FALSE
- #define YES TRUE
-
- #ifdef _DEBUG
- #undef THIS_FILE
- static char BASED_CODE THIS_FILE[] = __FILE__;
- #endif
-
- /////////////////////////////////////////////////////////////////////////////
- // CCalcDialog dialog
-
-
- CCalcDialog::CCalcDialog(CWnd* pParent /*=NULL*/)
- : CDialog(CCalcDialog::IDD, pParent)
- {
- //{{AFX_DATA_INIT(CCalcDialog)
- m_Display = _T("");
- //}}AFX_DATA_INIT
-
- m_enteredValue = 0.0;
- m_wasValueEntered = NO;
- m_decimalEntered = NO;
- m_lastKeyWasOperator = NO;
-
- calcObj = createCalcObject();
- }
-
- CCalcDialog::~CCalcDialog()
- {
- destroyCalcObject(calcObj);
- }
-
-
- void CCalcDialog::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CCalcDialog)
- DDX_Text(pDX, IDC_Display, m_Display);
- //}}AFX_DATA_MAP
- }
-
-
- BEGIN_MESSAGE_MAP(CCalcDialog, CDialog)
- //{{AFX_MSG_MAP(CCalcDialog)
- ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON10, OnDigit)
- ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON11, IDC_BUTTON14, OnFunction)
- ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON16, IDC_BUTTON17, OnClear)
- ON_BN_CLICKED(IDC_BUTTON18, OnEquals)
- ON_BN_CLICKED(IDC_BUTTON19, OnDecimal)
- ON_BN_CLICKED(IDC_BUTTON20, OnChangeSign)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
-
-
- /////////////////////////////////////////////////////////////////////////////
- // CCalcDialog message handlers
-
- void CCalcDialog::OnDigit(UINT nID)
- {
- int tag = nID - IDC_BUTTON1 + 1;
-
- if (tag == 10) tag = 0;
- if(m_decimalEntered){
- m_fractionMultiplier /= 10.0;
- m_enteredValue += tag * m_fractionMultiplier;
- } else
- m_enteredValue = m_enteredValue * 10 + tag;
- CCalcDialog::DisplayValue(m_enteredValue);
- m_wasValueEntered = YES;
- m_lastKeyWasOperator = NO;
- }
-
- void CCalcDialog::OnFunction(UINT nID)
- {
- double operand;
- int tag = nID - IDC_BUTTON11 + 10; // +10 puts it into the right range
-
- if(m_lastKeyWasOperator)
- changePendingOperation(calcObj, tag);
- else {
- operand = m_wasValueEntered ? m_enteredValue : m_result;
- m_result = setOperationForValue(calcObj, tag, operand);
- CCalcDialog::DisplayValue(m_result);
-
- m_enteredValue = 0.0;
- m_wasValueEntered = NO;
- m_decimalEntered = NO;
- }
- m_lastKeyWasOperator = YES;
- }
-
- void CCalcDialog::OnClear(UINT nID)
- {
- m_enteredValue = 0.0;
- m_result = 0.0;
- m_wasValueEntered = NO;
- if(nID == IDC_BUTTON16) // BUTTON_16 is CLEAR ALL
- clearAll(calcObj);
- m_decimalEntered = NO;
-
- CCalcDialog::DisplayValue(m_enteredValue);
- m_lastKeyWasOperator = NO;
- }
-
- void CCalcDialog::OnEquals()
- {
- m_result = performOperationWith(calcObj, m_enteredValue);
- CCalcDialog::DisplayValue(m_result);
-
- m_enteredValue = 0.0;
- m_wasValueEntered = NO;
- m_decimalEntered = NO;
- m_lastKeyWasOperator = NO;
- }
-
- void CCalcDialog::OnChangeSign()
- {
- m_enteredValue = m_wasValueEntered ? -m_enteredValue : -m_result;
- CCalcDialog::DisplayValue(m_enteredValue);
- m_wasValueEntered = YES;
- m_lastKeyWasOperator = NO;
- }
-
- void CCalcDialog::OnDecimal()
- {
- if(!m_decimalEntered){
- m_fractionMultiplier = 1.0;
- m_decimalEntered = YES;
- }
- m_wasValueEntered = YES;
- m_lastKeyWasOperator = NO;
- }
-
- void CCalcDialog::DisplayValue(double value)
- {
- char buf[256];
-
- sprintf(buf, "%15.10g", value);
- m_Display = buf;
- CCalcDialog::UpdateData(FALSE);
- }
-