📄 numpaddlg.cpp
字号:
// NumPadDlg.cpp : implementation file
//
#include "stdafx.h"
#include "resource.h"
#include "NumPadDlg.h"
#include "SubButton.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define IDC_KP_K0 1000
#define IDC_KP_K1 1001
#define IDC_KP_K2 1002
#define IDC_KP_K3 1003
#define IDC_KP_K4 1004
#define IDC_KP_K5 1005
#define IDC_KP_K6 1006
#define IDC_KP_K7 1007
#define IDC_KP_K8 1008
#define IDC_KP_K9 1009
#define IDC_KP_DEC 1011
#define IDC_KP_EQUAL 1012
#define IDC_KP_CHS 1013
#define IDC_KP_ADD 1014
#define IDC_KP_SUB 1015
#define IDC_KP_MUL 1016
#define IDC_KP_DIV 1017
#define IDC_KP_AC 1018
#define IDC_KP_C 1019
#define IDC_KP_DISPLAY 1020
#define sX(x) DRA::SCALEX(x)
#define sY(y) DRA::SCALEY(y)
//---------------------------------------------------------------------------
//
// CNumPadDlg dialog
//
//---------------------------------------------------------------------------
CNumPadDlg::CNumPadDlg(ENumberFormat format, CWnd* pParent /*=NULL*/)
: CDialog(/*CNumPadDlg::IDD, pParent*/),
m_format (format),
m_pDisplay (NULL)
{
DWORD dwBtn = SWS_VISIBLE | SBS_ROUND;
int x24, y20;
//{{AFX_DATA_INIT(CNumPadDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_bFullScreen = FALSE;
m_bError = false;
m_bDec = false;
m_bNew = true;
m_dblOpr =
m_dblVal = 0.0;
m_dblDec = 0.0;
m_op = opNone;
x24 = sX(24);
y20 = sY(20);
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, m_szDec, 7);
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, m_szSep, 7);
m_templ.Header(_T("NumPad"),
WS_POPUP | WS_CAPTION,
0, 0, 92, 94,
_T("Tahoma"), 8);
m_pDisplay = new CSubStatic(SWS_VISIBLE | SSS_RIGHT | SSS_ROUND, _T(""),
sX(4), sY(4), sX(130), y20, IDC_KP_DISPLAY);
m_wndCont.Add(m_pDisplay);
m_wndCont.Add(new CSubButton(dwBtn, _T("OK"), sX( 4), sY(98+30), sX(60), y20, IDOK));
m_wndCont.Add(new CSubButton(dwBtn, _T("Cancel"), sX(74), sY(98+30), sX(60), y20, IDCANCEL));
m_wndCont.Add(new CSubButton(dwBtn, _T("7"), sX( 4), sY(2+30), x24, y20, IDC_KP_K7));
m_wndCont.Add(new CSubButton(dwBtn, _T("8"), sX(30), sY(2+30), x24, y20, IDC_KP_K8));
m_wndCont.Add(new CSubButton(dwBtn, _T("9"), sX(56), sY(2+30), x24, y20, IDC_KP_K9));
m_wndCont.Add(new CSubButton(dwBtn, _T("4"), sX( 4), sY(26+30), x24, y20, IDC_KP_K4));
m_wndCont.Add(new CSubButton(dwBtn, _T("5"), sX(30), sY(26+30), x24, y20, IDC_KP_K5));
m_wndCont.Add(new CSubButton(dwBtn, _T("6"), sX(56), sY(26+30), x24, y20, IDC_KP_K6));
m_wndCont.Add(new CSubButton(dwBtn, _T("1"), sX( 4), sY(50+30), x24, y20, IDC_KP_K1));
m_wndCont.Add(new CSubButton(dwBtn, _T("2"), sX(30), sY(50+30), x24, y20, IDC_KP_K2));
m_wndCont.Add(new CSubButton(dwBtn, _T("3"), sX(56), sY(50+30), x24, y20, IDC_KP_K3));
m_wndCont.Add(new CSubButton(dwBtn, _T("0"), sX( 4), sY(74+30), x24, y20, IDC_KP_K0));
m_wndCont.Add(new CSubButton(dwBtn, _T("+/-"), sX(56), sY(74+30), x24, y20, IDC_KP_CHS));
if(m_format != fmtInteger)
m_wndCont.Add(new CSubButton(dwBtn, m_szDec, sX(30), sY(74+30), x24, y20, IDC_KP_DEC));
m_wndCont.Add(new CSubButton(dwBtn, _T("C"), sX( 84), sY( 2+30), x24, y20, IDC_KP_C));
m_wndCont.Add(new CSubButton(dwBtn, _T("AC"), sX(110), sY( 2+30), x24, y20, IDC_KP_AC));
m_wndCont.Add(new CSubButton(dwBtn, _T("*"), sX( 84), sY(26+30), x24, y20, IDC_KP_MUL));
m_wndCont.Add(new CSubButton(dwBtn, _T("/"), sX(110), sY(26+30), x24, y20, IDC_KP_DIV));
m_wndCont.Add(new CSubButton(dwBtn, _T("+"), sX( 84), sY(50+30), x24, y20, IDC_KP_ADD));
m_wndCont.Add(new CSubButton(dwBtn, _T("-"), sX(110), sY(50+30), x24, y20, IDC_KP_SUB));
m_wndCont.Add(new CSubButton(dwBtn, _T("="), sX( 84), sY(74+30), sX(50), y20, IDC_KP_EQUAL));
InitModalIndirect(m_templ);
}
void CNumPadDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CNumPadDlg)
// DDX_Control(pDX, IDC_KP_DEC, m_btnDec);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CNumPadDlg, CDialog)
//{{AFX_MSG_MAP(CNumPadDlg)
ON_BN_CLICKED(IDC_KP_AC, OnAc)
ON_BN_CLICKED(IDC_KP_CHS, OnChs)
ON_BN_CLICKED(IDC_KP_ADD, OnAdd)
ON_BN_CLICKED(IDC_KP_SUB, OnSub)
ON_BN_CLICKED(IDC_KP_MUL, OnMul)
ON_BN_CLICKED(IDC_KP_DIV, OnDiv)
ON_BN_CLICKED(IDC_KP_EQUAL, OnEqual)
ON_BN_CLICKED(IDC_KP_DEC, OnDec)
ON_BN_CLICKED(IDC_KP_C, OnC)
//}}AFX_MSG_MAP
ON_WM_ACTIVATE()
ON_WM_SETTINGCHANGE()
ON_CONTROL_RANGE(BN_CLICKED, IDC_KP_K0, IDC_KP_K9, OnNumericKey)
ON_WM_CHAR()
END_MESSAGE_MAP()
//---------------------------------------------------------------------------
//
// CNumPadDlg operations
//
//---------------------------------------------------------------------------
// CNumPadDlg::UpdateDisplay
//
// Updates the display
//
void CNumPadDlg::UpdateDisplay()
{
if(m_bError)
{
m_pDisplay->SetText(_T("ERROR"));
}
else
{
TCHAR szFmtOut[65];
Format(m_dblVal, szFmtOut, 64, m_format);
//
// Display the number
//
m_pDisplay->SetText(szFmtOut);
}
}
// CNumPadDlg::SetCurValue
//
// Sets the value from a currency type
//
void CNumPadDlg::SetCurValue(CURRENCY cy)
{
HRESULT hr;
hr = VarR8FromCy(cy, &m_dblVal);
if(hr != S_OK)
m_dblVal = 0;
}
// CNumPadDlg::GetCurValue
//
// Retuens the value as a currency type
//
CURRENCY CNumPadDlg::GetCurValue()
{
CURRENCY cy;
HRESULT hr;
hr = VarCyFromR8(m_dblVal, &cy);
if(hr != S_OK)
{
cy.Hi = 0;
cy.Lo = 0;
}
return cy;
}
//---------------------------------------------------------------------------
//
// CNumPadDlg message handlers
//
//---------------------------------------------------------------------------
// CNumPadDlg::OnInitDialog
//
// Initializes the dialog
//
BOOL CNumPadDlg::OnInitDialog()
{
LOGFONT lf;
CRect rc;
CDC* pDC = GetDC();
//
// Create the option font
//
// Points 8 : -11
// 9 : -12
// 10 : -13
//nHeight = -11;//(LONG)(-8 * pDC.GetDeviceCaps(LOGPIXELSY) / 72);
lf.lfHeight = DRA::HIDPIMulDiv(-9, pDC->GetDeviceCaps(LOGPIXELSY), 72); //-12; // 9 point
lf.lfWidth = 0;
lf.lfEscapement = 0;
lf.lfOrientation = 0;
lf.lfWeight = FW_BOLD;
lf.lfItalic = FALSE;
lf.lfUnderline = FALSE;
lf.lfStrikeOut = 0;
lf.lfCharSet = ANSI_CHARSET;
lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
lf.lfQuality = DEFAULT_QUALITY;
lf.lfPitchAndFamily = DEFAULT_PITCH | FF_SWISS;
lstrcpy(lf.lfFaceName, TEXT("Tahoma"));
m_fontDisplay.CreateFontIndirect(&lf);
m_pDisplay->SetFont(&m_fontDisplay);
lf.lfHeight = DRA::HIDPIMulDiv(-8, pDC->GetDeviceCaps(LOGPIXELSY), 72); // 8 point
lf.lfWeight = FW_NORMAL;
m_fontKeypad.CreateFontIndirect(&lf);
//
// Initialize the dialog
//
CDialog::OnInitDialog();
//
// Set the dialog caption
//
SetWindowText(m_strCaption);
//
// Initialize the static control
//
UpdateDisplay();
//
// Create the keypad
//
GetClientRect(&rc);
if(m_wndCont.Create(WS_CHILD|WS_VISIBLE, rc, this, 101))
m_wndCont.SetFont(&m_fontKeypad);
//
// Initialize the decimals button
//
// m_btnDec.SetWindowText(m_szDec);
SHSipPreference(m_hWnd, SIP_DOWN);
ReleaseDC(pDC);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
// CNumPadDlg::OnActivate
//
// Thanks to Tanzim Husain
//
void CNumPadDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
CWnd::OnActivate(nState, pWndOther, bMinimized);
}
// CNumPadDlg::OnSettingChange
//
// Handle the setting changes
// Thanks to Tanzim Husain
//
void CNumPadDlg::OnSettingChange(UINT uFlags, LPCTSTR lpszSection)
{
CWnd::OnSettingChange(uFlags, lpszSection);
}
//---------------------------------------------------------------------------
//
// CNumPadDlg command handlers
//
//---------------------------------------------------------------------------
// CNumPadDlg::OnNumericKey
//
// Processes all numeric keys
//
void CNumPadDlg::OnNumericKey(UINT nID)
{
if(m_bNew)
{
m_dblVal = 0.0;
m_bNew = false;
m_bDec = false;
}
if(m_bDec)
{
m_dblVal += (nID - IDC_KP_K0) * m_dblDec;
m_dblDec *= 0.1;
}
else if(fabs(m_dblVal) < 1e14)
m_dblVal = m_dblVal * 10.0 + (nID - IDC_KP_K0);
else
MessageBeep(MB_ICONEXCLAMATION);
UpdateDisplay();
}
// CNumPadDlg::OnAc
//
// Clears all values
//
void CNumPadDlg::OnAc()
{
m_bDec =
m_bError = false;
m_bNew = true;
m_dblOpr =
m_dblVal = 0.0;
m_op = opNone;
UpdateDisplay();
}
// CNumPadDlg::OnC
//
// Clears the last entry
//
void CNumPadDlg::OnC()
{
m_bDec =
m_bError = false;
m_bNew = true;
m_dblVal = 0.0;
UpdateDisplay();
}
// CNumPadDlg::OnChs
//
// Changes the sign
//
void CNumPadDlg::OnChs()
{
m_dblVal = -m_dblVal;
UpdateDisplay();
}
// CNumPadDlg::OnAdd
//
// Adds two numbers
//
void CNumPadDlg::OnAdd()
{
OnEqual();
m_dblOpr = m_dblVal;
m_op = opAdd;
}
// CNumPadDlg::OnSub
//
// Subtracts two numbers
//
void CNumPadDlg::OnSub()
{
OnEqual();
m_dblOpr = m_dblVal;
m_op = opSub;
}
// CNumPadDlg::OnMul
//
// Multiplies two numbers
//
void CNumPadDlg::OnMul()
{
OnEqual();
m_dblOpr = m_dblVal;
m_op = opMul;
}
// CNumPadDlg::OnDiv
//
// Divides two numbers
//
void CNumPadDlg::OnDiv()
{
OnEqual();
m_dblOpr = m_dblVal;
m_op = opDiv;
}
// CNumPadDlg::OnEqual
//
// Calculates the result of an operation
//
void CNumPadDlg::OnEqual()
{
m_bError = FALSE;
switch(m_op)
{
case opAdd:
m_dblVal += m_dblOpr;
break;
case opSub:
m_dblVal = m_dblOpr - m_dblVal;
break;
case opMul:
m_dblVal *= m_dblOpr;
break;
case opDiv:
if(m_dblVal == 0.0)
m_bError = TRUE;
else
m_dblVal = m_dblOpr / m_dblVal;
break;
default:
m_dblOpr = 0.0;
}
m_bDec = false;
m_bNew = true;
UpdateDisplay();
m_op = opNone;
}
// CNumPadDlg::OnDec
//
// Entering decimal numbers
//
void CNumPadDlg::OnDec()
{
if(!m_bDec)
{
m_bDec = true;
m_dblDec = 0.1;
if(m_bNew)
{
m_dblVal = 0.0;
m_bNew = false;
}
UpdateDisplay();
}
}
void CNumPadDlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
switch(nChar)
{
case 'c':
case 'C':
OnC();
break;
case 'a':
case 'A':
OnAc();
break;
case '.':
case ',':
OnDec();
break;
case '+':
OnAdd();
break;
case '-':
OnSub();
break;
case '*':
OnMul();
break;
case '/':
OnDiv();
break;
case '=':
OnEqual();
break;
case '_':
OnChs();
break;
default:
if(nChar >= '0' && nChar <= '9')
{
OnNumericKey(nChar - '0' + IDC_KP_K0);
}
}
CDialog::OnChar(nChar, nRepCnt, nFlags);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -