2025-11-27 16:46:48 +09:00

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__)