301 lines
8.6 KiB
C++
301 lines
8.6 KiB
C++
// Version: 9.3
|
|
|
|
#if !defined(_OXCALCULATORCTRL_H__)
|
|
#define _OXCALCULATORCTRL_H__
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif // _MSC_VER > 1000
|
|
|
|
#include "OXDllExt.h"
|
|
|
|
#include "OXBitmapButton.h"
|
|
#include "OXStatic.h"
|
|
|
|
#include "OXMainRes.h"
|
|
|
|
#define ID_NUMBERSYSTEM_DECIMAL 0
|
|
#define ID_NUMBERSYSTEM_HEXADECIMAL 1
|
|
#define ID_NUMBERSYSTEM_OCTAL 2
|
|
#define ID_NUMBERSYSTEM_BINARY 3
|
|
|
|
#ifndef PI
|
|
#define PI 3.14159265359
|
|
#endif
|
|
|
|
#define MAX_DIGIT_COUNT 13
|
|
#define MAX_FRACTIONAL_COUNT 12
|
|
|
|
|
|
// OXCalculatorCtrl.h : header file
|
|
//
|
|
|
|
|
|
enum Operator { OpNone, OpAdd, OpSubtract, OpMultiply, OpDivide, OpMod,
|
|
OpRaiseToPower, OpSin, OpCos, OpTan, OpCotan, OpFactorial,
|
|
OpLogarithm, OpNaturalLogarithm, OpReciprocal, OpSqrt };
|
|
enum CalcError { ErrNone, ErrDivideByZero, ErrOverflow };
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// COXCalculatorCtrl control
|
|
|
|
class OX_CLASS_DECL COXCalculatorCtrl : public CDialog
|
|
{
|
|
// Construction
|
|
public:
|
|
COXCalculatorCtrl(CWnd* pParent=NULL, double dValue=0); // standard constructor
|
|
|
|
virtual BOOL Create(CWnd* pParentWnd);
|
|
|
|
protected:
|
|
// Dialog Data
|
|
//{{AFX_DATA(COXCalculatorCtrl)
|
|
enum { IDD = IDD_OX_DIALOG_CALCULATOR };
|
|
CComboBox m_comboNumberSystem;
|
|
COXBitmapButton m_btnNaturalAlgorithm;
|
|
COXBitmapButton m_btnLogarithm;
|
|
COXBitmapButton m_btnF;
|
|
COXBitmapButton m_btnE;
|
|
COXBitmapButton m_btnD;
|
|
COXBitmapButton m_btnC;
|
|
COXBitmapButton m_btnB;
|
|
COXBitmapButton m_btnA;
|
|
COXStatic m_ctlDisplay;
|
|
COXBitmapButton m_btnTan;
|
|
COXBitmapButton m_btnSin;
|
|
COXBitmapButton m_btnPower;
|
|
COXBitmapButton m_btnPi;
|
|
COXBitmapButton m_btnFactorial;
|
|
COXBitmapButton m_btnCotan;
|
|
COXBitmapButton m_btnCos;
|
|
COXBitmapButton m_btnSubtract;
|
|
COXBitmapButton m_btnSqrt;
|
|
COXBitmapButton m_btnReciprocal;
|
|
COXBitmapButton m_btnMultiply;
|
|
COXBitmapButton m_btnMod;
|
|
COXBitmapButton m_btnEqual;
|
|
COXBitmapButton m_btnDivide;
|
|
COXBitmapButton m_btnDelimiter;
|
|
COXBitmapButton m_btnClearNumber;
|
|
COXBitmapButton m_btnClear;
|
|
COXBitmapButton m_btnChangeSign;
|
|
COXBitmapButton m_btnBack;
|
|
COXBitmapButton m_btnAdd;
|
|
COXBitmapButton m_btn9;
|
|
COXBitmapButton m_btn8;
|
|
COXBitmapButton m_btn7;
|
|
COXBitmapButton m_btn6;
|
|
COXBitmapButton m_btn5;
|
|
COXBitmapButton m_btn4;
|
|
COXBitmapButton m_btn3;
|
|
COXBitmapButton m_btn2;
|
|
COXBitmapButton m_btn1;
|
|
COXBitmapButton m_btn0;
|
|
BOOL m_bScientific;
|
|
int m_nNumberSystem;
|
|
CString m_sDisplayString;
|
|
//}}AFX_DATA
|
|
|
|
double m_dValue;
|
|
double m_dOperand;
|
|
BOOL m_bOperandAvailable;
|
|
BOOL m_bAddingFractional;
|
|
Operator m_operator;
|
|
Operator m_lastCompletedOperator;
|
|
CalcError m_errorState;
|
|
|
|
TCHAR m_chDecimalSeparator;
|
|
int m_nFractionalCount;
|
|
|
|
HACCEL m_hAccel;
|
|
|
|
// Overrides
|
|
// ClassWizard generated virtual function overrides
|
|
//{{AFX_VIRTUAL(COXCalculatorCtrl)
|
|
public:
|
|
virtual BOOL PreTranslateMessage(MSG* pMsg);
|
|
protected:
|
|
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
|
|
//}}AFX_VIRTUAL
|
|
|
|
public:
|
|
inline TCHAR GetDecimalSeparator() const { return m_chDecimalSeparator; }
|
|
void SetDecimalSeparator(TCHAR chDecimalSeparator);
|
|
|
|
inline double GetResult() const { return m_dValue; }
|
|
inline CString GetResultAsString() const { return GetDisplayString(m_dValue); }
|
|
|
|
inline int GetNumberSystem() const { return m_nNumberSystem; }
|
|
void SetNumberSystem(const int nNumberSystem);
|
|
|
|
void SetOperand(double dOperand, BOOL bRecalcLayout=FALSE);
|
|
void SetResult(double dValue);
|
|
|
|
// Implementation
|
|
protected:
|
|
void SetupButton(COXBitmapButton* pButton, COLORREF clrText);
|
|
|
|
void ShowControls();
|
|
|
|
CString GetDisplayString(double dValue, int nFractionalCount=-1) const;
|
|
|
|
int GetDecimalDigitCount(double dValue) const;
|
|
int GetFractionalDigitCount(double dValue) const;
|
|
|
|
void AddDigit(double dDigit);
|
|
void RemoveLastDigit();
|
|
|
|
void PerformUnaryOperation(Operator oper);
|
|
void PerformBinaryOperation(Operator oper);
|
|
void PerformLastOperation();
|
|
|
|
// Generated message map functions
|
|
//{{AFX_MSG(COXCalculatorCtrl)
|
|
afx_msg void OnButton0();
|
|
afx_msg void OnButton1();
|
|
afx_msg void OnButton2();
|
|
afx_msg void OnButton3();
|
|
afx_msg void OnButton4();
|
|
afx_msg void OnButton5();
|
|
afx_msg void OnButton6();
|
|
afx_msg void OnButton7();
|
|
afx_msg void OnButton8();
|
|
afx_msg void OnButton9();
|
|
afx_msg void OnButtonAdd();
|
|
afx_msg void OnButtonBack();
|
|
afx_msg void OnButtonChangesign();
|
|
afx_msg void OnButtonClear();
|
|
afx_msg void OnButtonClearnumber();
|
|
afx_msg void OnButtonDelimiter();
|
|
afx_msg void OnButtonDivide();
|
|
afx_msg void OnButtonEqual();
|
|
afx_msg void OnButtonMod();
|
|
afx_msg void OnButtonMultiply();
|
|
afx_msg void OnButtonReciprocal();
|
|
afx_msg void OnButtonSqrt();
|
|
afx_msg void OnButtonSubtract();
|
|
virtual BOOL OnInitDialog();
|
|
afx_msg void OnButtonA();
|
|
afx_msg void OnButtonB();
|
|
afx_msg void OnButtonC();
|
|
afx_msg void OnButtonCos();
|
|
afx_msg void OnButtonCotan();
|
|
afx_msg void OnButtonD();
|
|
afx_msg void OnButtonE();
|
|
afx_msg void OnButtonF();
|
|
afx_msg void OnButtonFactorial();
|
|
afx_msg void OnButtonLogarithm();
|
|
afx_msg void OnButtonNaturalLogarithm();
|
|
afx_msg void OnButtonPi();
|
|
afx_msg void OnButtonPower();
|
|
afx_msg void OnButtonSin();
|
|
afx_msg void OnButtonTan();
|
|
afx_msg void OnCheckScientific();
|
|
afx_msg void OnSelchangeComboNumberSystem();
|
|
//}}AFX_MSG
|
|
DECLARE_MESSAGE_MAP()
|
|
|
|
friend class COXCalculatorPopup;
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////
|
|
|
|
// popup window alignment
|
|
//
|
|
// popup window window RightTop will be displayed at the LeftTop point of parent window
|
|
// or rect specified in COXPopupBarCtrl::Pick function
|
|
#define ID_OXCALCULATOR_ALIGNLEFT 0x00000000
|
|
// popup window window LeftTop will be displayed at the RightTop point of parent window
|
|
// or rect specified in COXPopupBarCtrl::Pick function
|
|
#define ID_OXCALCULATOR_ALIGNRIGHT 0x00000001
|
|
// popup window window LeftBottom will be displayed at the LeftTop point of parent window
|
|
// or rect specified in COXPopupBarCtrl::Pick function
|
|
#define ID_OXCALCULATOR_ALIGNTOP 0x00000002
|
|
// popup window window LeftTop will be displayed at the LeftBottom point of parent window
|
|
// or rect specified in COXPopupBarCtrl::Pick function
|
|
#define ID_OXCALCULATOR_ALIGNBOTTOM 0x00000003
|
|
// popup window window RightBottom will be displayed at the LeftBottom point of parent window
|
|
// or rect specified in COXPopupBarCtrl::Pick function
|
|
#define ID_OXCALCULATOR_ALIGNLEFTBOTTOM 0x00000004
|
|
// popup window window LeftBottom will be displayed at the RightBottom point of parent window
|
|
// or rect specified in COXPopupBarCtrl::Pick function
|
|
#define ID_OXCALCULATOR_ALIGNRIGHTBOTTOM 0x00000005
|
|
// popup window window RightBottom will be displayed at the RightTop point of parent window
|
|
// or rect specified in COXPopupBarCtrl::Pick function
|
|
#define ID_OXCALCULATOR_ALIGNTOPRIGHT 0x00000006
|
|
// popup window window RightTop will be displayed at the RightBottom point of parent window
|
|
// or rect specified in COXPopupBarCtrl::Pick function
|
|
#define ID_OXCALCULATOR_ALIGNBOTTOMRIGHT 0x00000007
|
|
|
|
|
|
#define OXCALCULATORPOPUP_XMARGIN 5
|
|
#define OXCALCULATORPOPUP_YMARGIN 5
|
|
#define OXCALCULATORPOPUP_BUTTON_HEIGHT 24
|
|
|
|
|
|
|
|
class OX_CLASS_DECL COXCalculatorPopup : public CWnd
|
|
{
|
|
// Construction
|
|
public:
|
|
COXCalculatorPopup();
|
|
virtual ~COXCalculatorPopup();
|
|
|
|
BOOL Create(CWnd* pParentWnd=NULL, HBRUSH hbrBackground=NULL);
|
|
|
|
BOOL Pick(double dStartValue=0, int nAlignment=ID_OXCALCULATOR_ALIGNBOTTOM,
|
|
CRect rectParent=CRect(0,0,0,0), CSize szOffset=CSize(0,0));
|
|
|
|
inline double GetResult() const
|
|
{
|
|
ASSERT(::IsWindow(m_calculator.GetSafeHwnd()));
|
|
return m_calculator.GetResult();
|
|
}
|
|
|
|
inline CString GetResultAsString() const
|
|
{
|
|
ASSERT(::IsWindow(m_calculator.GetSafeHwnd()));
|
|
return m_calculator.GetResultAsString();
|
|
}
|
|
|
|
inline COXCalculatorCtrl* GetCalculatorCtrl() { return &m_calculator; }
|
|
|
|
// helper for detecting whether child descendent of parent
|
|
// (works with owned popups as well)
|
|
static BOOL IsDescendant(CWnd* pWndParent, CWnd* pWndChild);
|
|
|
|
protected:
|
|
BOOL CalcWindowSize();
|
|
BOOL AdjustWindowPos(int nAlignment=ID_OXCALCULATOR_ALIGNBOTTOM,
|
|
CRect rectParent=CRect(0,0,0,0), CSize szOffset=CSize(0,0));
|
|
|
|
// Generated message map functions
|
|
//{{AFX_MSG(COXCalculatorPopup)
|
|
afx_msg void OnOk();
|
|
afx_msg void OnCancel();
|
|
//}}AFX_MSG
|
|
DECLARE_MESSAGE_MAP()
|
|
|
|
protected:
|
|
COXCalculatorCtrl m_calculator;
|
|
COXBitmapButton m_btnOk;
|
|
COXBitmapButton m_btnCancel;
|
|
|
|
CWnd* m_pParentWnd;
|
|
|
|
// m_nState = 0 - control is active
|
|
// m_nState = 1 - user pressed 'OK'
|
|
// m_nState = 2 - user left the window without choosing any number
|
|
int m_nState;
|
|
|
|
CRect m_rect;
|
|
CRect m_rectCalculator;
|
|
CRect m_rectBtnOk;
|
|
CRect m_rectBtnCancel;
|
|
};
|
|
|
|
//{{AFX_INSERT_LOCATION}}
|
|
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
|
|
|
|
#endif // !defined(_OXCALCULATORCTRL_H__)
|