/***********************************************************************/ /* Copyright (C) 2002 Definitive Solutions, Inc. All Rights Reserved. */ /* THIS COMPUTER PROGRAM IS PROPRIETARY AND CONFIDENTIAL TO DEFINITIVE */ /* SOLUTIONS, INC. AND ITS LICENSORS AND CONTAINS TRADE SECRETS OF */ /* DEFINITIVE SOLUTIONS, INC. THAT ARE PROVIDED PURSUANT TO A WRITTEN */ /* AGREEMENT CONTAINING RESTRICTIONS ON USE AND DISCLOSURE. ANY USE, */ /* REPRODUCTION, OR TRANSFER EXCEPT AS PROVIDED IN SUCH AGREEMENT */ /* IS STRICTLY PROHIBITED. */ /***********************************************************************/ #include "stdafx.h" #include "MySpinCtrl.h" #include "Generic.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // MySpinCtrl // Constructor. MySpinCtrl::MySpinCtrl() : m_nLo(0) , m_nHi(INT_MAX) , m_dInc(1.0) , m_nDigitsAfterDecimal(0) { } // Destructor. /* virtual */ MySpinCtrl::~MySpinCtrl() { } BEGIN_MESSAGE_MAP(MySpinCtrl, CSpinButtonCtrl) //{{AFX_MSG_MAP(MySpinCtrl) ON_NOTIFY_REFLECT(UDN_DELTAPOS, OnDeltapos) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // MySpinCtrl message handlers // This is called by MFC after the window's HWND has been bound to the // MySpinCtrl object, but before the subclassing occurs. Note that this class // never gets WM_CREATE, because that comes before the subclassing occurs. void MySpinCtrl::PreSubclassWindow() { VALIDATE; _ASSERTE(! (UDS_SETBUDDYINT & GetStyle()) && "'Auto Buddy Int' style *MUST NOT* be checked"); _ASSERTE( (UDS_AUTOBUDDY & GetStyle()) && "'Auto Buddy' style *MUST* be checked"); // Do this so that, the first time, the up/down arrows work in the right // direction, and the range is a reasonable value. SetRange(0, 1); SetRangeDWord(0, INT_MAX); CSpinButtonCtrl::PreSubclassWindow(); } // UDN_DELTAPOS. void MySpinCtrl::OnDeltapos(NMHDR* pNMHDR, LRESULT* pResult) { VALIDATE; _ASSERTE(! (UDS_SETBUDDYINT & GetStyle()) && "'Auto Buddy Int' style *MUST* be unchecked"); _ASSERTE( (UDS_AUTOBUDDY & GetStyle()) && "'Auto Buddy' style *MUST* be checked"); NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR; // Grab buddy edit control value. CString sBuddyValue; GetBuddy()->GetWindowText(sBuddyValue); // Do some range validation here. double dBuddyValue(Generic::CommasToDouble(sBuddyValue)); double dProposedValue(dBuddyValue + (m_dInc * (double) pNMUpDown->iDelta)); if (dProposedValue < m_nLo || dProposedValue > m_nHi) { MessageBeep((UINT) -1); } else { // Adjust buddy edit control value by new value. if (UDS_NOTHOUSANDS & GetStyle()) { sBuddyValue.Format("%.*f", m_nDigitsAfterDecimal, dProposedValue); } else { sBuddyValue = Generic::DoubleToCommas(dProposedValue, m_nDigitsAfterDecimal); } GetBuddy()->SetWindowText(sBuddyValue); } *pResult = 0; } // Set 32-bit ranges. void MySpinCtrl::SetRangeDWord(int nLo, int nHi) { VALIDATE; _ASSERTE(! (UDS_SETBUDDYINT & GetStyle()) && "'Auto Buddy Int' style *MUST* be unchecked"); _ASSERTE( (UDS_AUTOBUDDY & GetStyle()) && "'Auto Buddy' style *MUST* be checked"); m_nLo = nLo; m_nHi = nHi; } // Set the current value. void MySpinCtrl::SetPosDWord(int nPos) { VALIDATE; _ASSERTE(! (UDS_SETBUDDYINT & GetStyle()) && "'Auto Buddy Int' style *MUST* be unchecked"); _ASSERTE( (UDS_AUTOBUDDY & GetStyle()) && "'Auto Buddy' style *MUST* be checked"); CString sBuddyValue; if (UDS_NOTHOUSANDS & GetStyle()) { sBuddyValue.Format("%d", nPos); } else { sBuddyValue = Generic::IntToCommas(nPos); } GetBuddy()->SetWindowText(sBuddyValue); } // Get the current value. int MySpinCtrl::GetPosDWord() const { VALIDATE; _ASSERTE(! (UDS_SETBUDDYINT & GetStyle()) && "'Auto Buddy Int' style *MUST* be unchecked"); _ASSERTE( (UDS_AUTOBUDDY & GetStyle()) && "'Auto Buddy' style *MUST* be checked"); // Grab buddy edit control value. CString sBuddyValue; GetBuddy()->GetWindowText(sBuddyValue); // Do some range validation here. return Generic::CommasToInt(sBuddyValue); } // Set how much each click moves. void MySpinCtrl::SetIncrement(double dInc) { VALIDATE; _ASSERTE(0.0 < dInc); m_dInc = max(0.0, dInc); } // Set how to display data. void MySpinCtrl::SetDigitsAfterDecimal(int nDigitsAfterDecimal) { VALIDATE; _ASSERTE(0 <= nDigitsAfterDecimal); m_nDigitsAfterDecimal = max(0, nDigitsAfterDecimal); }