⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 numpaddlg.cpp

📁 基于WINDOWS mobile 的用于创建一个窗体和自定义试图的工程
💻 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 + -