reman3/Rayman_X/cpa/tempgrp/Ctl/Src/WControls/CTL_WSpn.cpp

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