windows-nt/Source/XPSP1/NT/admin/controls/smonctrl/stepper.cpp
2020-09-26 16:20:57 +08:00

110 lines
1.8 KiB
C++

/*++
Copyright (C) 1996-1999 Microsoft Corporation
Module Name:
stepper.cpp
Abstract:
Implements time keeping and display in the graph window.
--*/
#include "polyline.h"
CStepper::CStepper()
{
m_iPos = 0;
m_iStepNum = 0;
m_iStepCnt = 1;
}
void CStepper::Init(INT iLength, INT iStepCnt)
{
m_iStepCnt = iStepCnt ? iStepCnt : 1;
m_iStepSize = iLength / m_iStepCnt;
m_iRemainder = iLength - m_iStepCnt * m_iStepSize;
m_iState = m_iStepCnt;
m_iPos = 0;
m_iStepNum = 0;
}
void CStepper::Reset()
{
m_iPos = 0;
m_iStepNum = 0;
m_iState = m_iStepCnt;
}
INT CStepper::NextPosition()
{
m_iPos += m_iStepSize;
m_iState -= m_iRemainder;
if (m_iState <= 0)
{
m_iState += m_iStepCnt;
m_iPos++;
}
m_iStepNum++;
return m_iPos;
}
INT CStepper::PrevPosition()
{
m_iPos -= m_iStepSize;
m_iState += m_iRemainder;
if (m_iState > m_iStepCnt)
{
m_iState -= m_iStepCnt;
m_iPos--;
}
m_iStepNum--;
return m_iPos;
}
INT CStepper::StepTo(INT nSteps)
{
INT iDiff;
iDiff = (nSteps * m_iRemainder) / m_iStepCnt;
m_iState = (iDiff + 1) * m_iStepCnt - (nSteps * m_iRemainder);
m_iPos = (nSteps * m_iStepSize) + iDiff;
m_iStepNum = nSteps;
return m_iPos;
}
INT CStepper::PrevStepNum( INT iPosition )
{
INT iStepNum = -1;
INT iLength;
// Floating point conversion to integer truncates,
// so this method returns the step previous to the position.
iLength = m_iStepCnt * m_iStepSize + m_iRemainder;
if ( iPosition <= iLength ) {
// Calculation is (iPosition/iLength) * m_iStepCnt.
iStepNum = iPosition * m_iStepCnt;
iStepNum = iStepNum / iLength;
}
return iStepNum;
}