367 lines
9.4 KiB
C++
367 lines
9.4 KiB
C++
// CPACSpin.cpp : implementation file
|
|
////////////////////////////////////////////
|
|
#include "StdAfx.h"
|
|
|
|
//ANNECY CB
|
|
#if 0
|
|
#include "WControls\CTL_WSpn.hpp"
|
|
|
|
#include "Controls\CTL_CtlI.hpp"
|
|
#include "Controls\CTL_CtlF.hpp"
|
|
#include "Controls\CTL_CtlV.hpp"
|
|
#include "Controls\CTL_Cnst.hpp"
|
|
#include "Others\CTL_Pub.hpp"
|
|
|
|
//External Modules
|
|
#include "CTL_ErO.hpp"
|
|
#include "IncTUT.h"
|
|
//End of External Modules
|
|
|
|
short CTL_g_uwScreenHeight = 0;
|
|
|
|
UDACCEL g_a_struc_Accel[C_ACCEL_NB] =
|
|
{
|
|
{ 1, 1 },
|
|
{ 1, 2 },
|
|
{ 1, 3 },
|
|
{ 1, 4 },
|
|
{ 1, 5 },
|
|
};
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CTL_Editor_SpinButton
|
|
|
|
BEGIN_MESSAGE_MAP(CTL_Editor_SpinButton, CSpinButtonCtrl)
|
|
//{{AFX_MSG_MAP(CTL_Editor_SpinButton)
|
|
ON_NOTIFY_REFLECT(UDN_DELTAPOS, OnDeltapos)
|
|
ON_WM_LBUTTONDOWN()
|
|
ON_WM_LBUTTONUP()
|
|
ON_WM_MOUSEMOVE()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
//***************************************************************************
|
|
CTL_Editor_SpinButton::CTL_Editor_SpinButton(CTL_Editor_IntegerControl *_pclControl,
|
|
long _lLower,
|
|
long _lUpper,
|
|
CWnd *_pclParentWnd)
|
|
|
|
: CTL_BaseWindowsControl(_pclControl,
|
|
_pclParentWnd)
|
|
{
|
|
m_pclIntegerControl = _pclControl;
|
|
m_pclDecimalControl = NULL;
|
|
m_pclVectorControl = NULL;
|
|
|
|
ERROR_ASSERT(_lLower < _lUpper);
|
|
m_lLower = _lLower;
|
|
m_lUpper = _lUpper;
|
|
|
|
m_tdeType = EDCAR_SPIN_TYPE_INTEGER;
|
|
|
|
//Creates control
|
|
CRect crBidonRect(0,0,10,10);
|
|
DWORD lStyles = WS_CHILD | UDS_ARROWKEYS | UDS_AUTOBUDDY;
|
|
if ( Create(lStyles,
|
|
crBidonRect,
|
|
_pclParentWnd,
|
|
CTL_fn_lGetNextAvailableIDForControl()) )
|
|
{
|
|
SetAccel(C_ACCEL_NB, g_a_struc_Accel);
|
|
SetRange(0, 100);
|
|
}
|
|
|
|
m_uwManualIntegerDelta = 1;
|
|
m_bManualPosIsOn = FALSE;
|
|
|
|
if ( CTL_g_uwScreenHeight == 0 )
|
|
{
|
|
//Gets screen's height
|
|
HDC hdc;
|
|
hdc = ::GetWindowDC(NULL);
|
|
CTL_g_uwScreenHeight = GetDeviceCaps(hdc, VERTRES);
|
|
::ReleaseDC(NULL,hdc);
|
|
}
|
|
}
|
|
|
|
//***************************************************************************
|
|
CTL_Editor_SpinButton::CTL_Editor_SpinButton(CTL_Editor_DecimalControl *_pclControl,
|
|
long double _ldLower,
|
|
long double _ldUpper,
|
|
CWnd *_pclParentWnd)
|
|
|
|
: CTL_BaseWindowsControl(_pclControl,
|
|
_pclParentWnd)
|
|
{
|
|
m_pclIntegerControl = NULL;
|
|
m_pclDecimalControl = _pclControl;
|
|
m_pclVectorControl = NULL;
|
|
m_ldLower = _ldLower;
|
|
m_ldUpper = _ldUpper;
|
|
|
|
m_tdeType = EDCAR_SPIN_TYPE_DECIMAL;
|
|
|
|
//Creates control
|
|
CRect crBidonRect(0,0,10,10);
|
|
DWORD lStyles = WS_CHILD | UDS_ARROWKEYS | UDS_AUTOBUDDY;
|
|
if ( Create(lStyles,
|
|
crBidonRect,
|
|
_pclParentWnd,
|
|
CTL_fn_lGetNextAvailableIDForControl()) )
|
|
{
|
|
SetAccel(C_ACCEL_NB, g_a_struc_Accel);
|
|
SetRange(0, 100);
|
|
}
|
|
//Computes divisor value
|
|
char cCounter = C_SPIN_PRECISION;
|
|
m_ldDivisor = 1.0;
|
|
while ( cCounter != 0 )
|
|
{
|
|
m_ldDivisor *= 10.0;
|
|
cCounter --;
|
|
}
|
|
|
|
m_fManualDecimalDelta = (float)0.1;
|
|
m_bManualPosIsOn = FALSE;
|
|
|
|
if ( CTL_g_uwScreenHeight == 0 )
|
|
{
|
|
//Gets screen's height
|
|
HDC hdc;
|
|
hdc = ::GetWindowDC(NULL);
|
|
CTL_g_uwScreenHeight = GetDeviceCaps(hdc, VERTRES);
|
|
::ReleaseDC(NULL,hdc);
|
|
}
|
|
}
|
|
|
|
//***************************************************************************
|
|
CTL_Editor_SpinButton::CTL_Editor_SpinButton(CTL_Editor_VectorControl *_pclControl,
|
|
long double _ldLower,
|
|
long double _ldUpper,
|
|
CWnd *_pclParentWnd)
|
|
|
|
: CTL_BaseWindowsControl(_pclControl,
|
|
_pclParentWnd)
|
|
{
|
|
m_pclIntegerControl = NULL;
|
|
m_pclDecimalControl = NULL;
|
|
m_pclVectorControl = _pclControl;
|
|
|
|
m_ldLower = _ldLower;
|
|
m_ldUpper = _ldUpper;
|
|
|
|
m_tdeType = EDCAR_SPIN_TYPE_VECTOR;
|
|
|
|
//Creates control
|
|
CRect crBidonRect(0,0,10,10);
|
|
DWORD lStyles = WS_CHILD | UDS_ARROWKEYS | UDS_AUTOBUDDY;
|
|
if ( Create( lStyles,
|
|
crBidonRect,
|
|
_pclParentWnd,
|
|
CTL_fn_lGetNextAvailableIDForControl())
|
|
)
|
|
{
|
|
SetAccel(C_ACCEL_NB, g_a_struc_Accel);
|
|
SetRange(0, 100);
|
|
}
|
|
|
|
//Computes divisor value
|
|
char cCounter = C_SPIN_PRECISION;
|
|
m_ldDivisor = 1.0;
|
|
while ( cCounter != 0 )
|
|
{
|
|
m_ldDivisor *= 10.0;
|
|
cCounter --;
|
|
}
|
|
|
|
m_fManualDecimalDelta = (float)0.1;
|
|
m_bManualPosIsOn = FALSE;
|
|
|
|
if ( CTL_g_uwScreenHeight == 0 )
|
|
{
|
|
//Gets screen's height
|
|
HDC hdc;
|
|
hdc = ::GetWindowDC(NULL);
|
|
CTL_g_uwScreenHeight = GetDeviceCaps(hdc, VERTRES);
|
|
::ReleaseDC(NULL,hdc);
|
|
}
|
|
}
|
|
|
|
//***************************************************************************
|
|
CTL_Editor_SpinButton::~CTL_Editor_SpinButton()
|
|
{
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CTL_Editor_SpinButton message handlers
|
|
|
|
//***************************************************************************
|
|
void CTL_Editor_SpinButton::OnDeltapos(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
|
|
|
|
switch ( m_tdeType )
|
|
{
|
|
//---------------------------------------------------------
|
|
case EDCAR_SPIN_TYPE_INTEGER:
|
|
{
|
|
m_lCurrent += pNMUpDown->iDelta;
|
|
|
|
if ( m_lCurrent > m_lUpper )
|
|
m_lCurrent = m_lUpper;
|
|
else if ( m_lCurrent < m_lLower )
|
|
m_lCurrent = m_lLower;
|
|
|
|
m_pclIntegerControl->m_fn_vUpdateEdit(m_lCurrent, CTL_UPDATE_REASON__DATA_MODIFIED_BY_USER);
|
|
}
|
|
break;
|
|
|
|
//---------------------------------------------------------
|
|
case EDCAR_SPIN_TYPE_DECIMAL:
|
|
{
|
|
m_ldCurrent += ((long double)(pNMUpDown->iDelta) / m_ldDivisor);
|
|
|
|
if ( m_ldCurrent > m_ldUpper )
|
|
m_ldCurrent = m_ldUpper;
|
|
else if ( m_ldCurrent < m_ldLower )
|
|
m_ldCurrent = m_ldLower;
|
|
|
|
m_pclDecimalControl->m_fn_vUpdateEdit(m_ldCurrent, CTL_UPDATE_REASON__DATA_MODIFIED_BY_USER);
|
|
}
|
|
break;
|
|
|
|
//---------------------------------------------------------
|
|
case EDCAR_SPIN_TYPE_VECTOR:
|
|
{
|
|
m_ldCurrent += ((long double)(pNMUpDown->iDelta) / m_ldDivisor);
|
|
|
|
if ( m_ldCurrent > m_ldUpper )
|
|
m_ldCurrent = m_ldUpper;
|
|
else if ( m_ldCurrent < m_ldLower )
|
|
m_ldCurrent = m_ldLower;
|
|
|
|
m_pclVectorControl->m_fn_vUpdateEdit(m_ldCurrent, this, CTL_UPDATE_REASON__DATA_MODIFIED_BY_USER);
|
|
}
|
|
break;
|
|
|
|
}
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
//***************************************************************************
|
|
void CTL_Editor_SpinButton::m_fn_vSetCurrentPos(long lNewValue)
|
|
{
|
|
m_lCurrent = lNewValue;
|
|
}
|
|
|
|
//***************************************************************************
|
|
void CTL_Editor_SpinButton::m_fn_vSetCurrentPos(long double ldNewValue)
|
|
{
|
|
m_ldCurrent = ldNewValue;
|
|
}
|
|
|
|
//***************************************************************************
|
|
void CTL_Editor_SpinButton::OnLButtonDown(UINT nFlags, CPoint point)
|
|
{
|
|
SetCapture();
|
|
m_bManualPosIsOn = TRUE;
|
|
|
|
ClientToScreen(&point);
|
|
m_uwOldPosition = (unsigned short)point.y;
|
|
|
|
CSpinButtonCtrl::OnRButtonDown(nFlags, point);
|
|
}
|
|
|
|
//***************************************************************************
|
|
void CTL_Editor_SpinButton::OnMouseMove(UINT nFlags, CPoint point)
|
|
{
|
|
if ( m_bManualPosIsOn )
|
|
{
|
|
CPoint cpScreenPos = point;
|
|
ClientToScreen(&cpScreenPos);
|
|
|
|
if ( cpScreenPos.y == 0 )
|
|
{
|
|
SetCursorPos(cpScreenPos.x, CTL_g_uwScreenHeight-2);
|
|
cpScreenPos.y = m_uwOldPosition = CTL_g_uwScreenHeight-2;
|
|
|
|
}
|
|
|
|
if ( cpScreenPos.y == (CTL_g_uwScreenHeight-1) )
|
|
{
|
|
SetCursorPos(cpScreenPos.x, 1);
|
|
cpScreenPos.y = m_uwOldPosition = 1;
|
|
}
|
|
|
|
switch ( m_tdeType )
|
|
{
|
|
case EDCAR_SPIN_TYPE_INTEGER:
|
|
{
|
|
long lNewValue = (long)(m_lCurrent + (m_uwOldPosition - cpScreenPos.y) * m_uwManualIntegerDelta);
|
|
if ( lNewValue > m_lUpper )
|
|
lNewValue = m_lUpper;
|
|
else if ( lNewValue < m_lLower )
|
|
lNewValue = m_lLower;
|
|
m_fn_vSetCurrentPos(lNewValue);
|
|
m_pclIntegerControl->m_fn_vUpdateEdit(m_lCurrent, CTL_UPDATE_REASON__DATA_MODIFIED_BY_USER);
|
|
}
|
|
break;
|
|
|
|
case EDCAR_SPIN_TYPE_DECIMAL:
|
|
{
|
|
long double ldNewValue = (long double)(m_ldCurrent + (m_uwOldPosition - cpScreenPos.y) * m_fManualDecimalDelta);
|
|
if ( ldNewValue > m_ldUpper )
|
|
ldNewValue = m_ldUpper;
|
|
else if ( ldNewValue < m_ldLower )
|
|
ldNewValue = m_ldLower;
|
|
m_fn_vSetCurrentPos(ldNewValue);
|
|
m_pclDecimalControl->m_fn_vUpdateEdit(m_ldCurrent, CTL_UPDATE_REASON__DATA_MODIFIED_BY_USER);
|
|
}
|
|
break;
|
|
|
|
case EDCAR_SPIN_TYPE_VECTOR:
|
|
{
|
|
long double ldNewValue = (long double)(m_ldCurrent + (m_uwOldPosition - cpScreenPos.y) * m_fManualDecimalDelta);
|
|
if ( ldNewValue > m_ldUpper )
|
|
ldNewValue = m_ldUpper;
|
|
else if ( ldNewValue < m_ldLower )
|
|
ldNewValue = m_ldLower;
|
|
m_fn_vSetCurrentPos(ldNewValue);
|
|
m_pclVectorControl->m_fn_vUpdateEdit(m_ldCurrent, this, CTL_UPDATE_REASON__DATA_MODIFIED_BY_USER);
|
|
}
|
|
break;
|
|
}
|
|
|
|
m_uwOldPosition = (unsigned short)cpScreenPos.y ;
|
|
}
|
|
|
|
CSpinButtonCtrl::OnMouseMove(nFlags, point);
|
|
}
|
|
|
|
//***************************************************************************
|
|
void CTL_Editor_SpinButton::OnLButtonUp(UINT nFlags, CPoint point)
|
|
{
|
|
ReleaseCapture();
|
|
m_bManualPosIsOn = FALSE;
|
|
|
|
CSpinButtonCtrl::OnRButtonUp(nFlags, point);
|
|
}
|
|
|
|
//**********************************************************************************
|
|
//For TUT registration
|
|
void CTL_Editor_SpinButton::m_pub_fn_vRegisterWindowsControl(CString _csAdditionnalInfo)
|
|
{
|
|
#ifndef CTL_WITH_NO_TUT
|
|
m_pro_fn_vRegisterWindowsControl(_csAdditionnalInfo, TUT_e_Spin, "Spin Control", this);
|
|
#endif //CTL_WITH_NO_TUT
|
|
}
|
|
|
|
#endif
|
|
//ENDANNECY CB
|