short TActiveScroller::CalcScrollBarValueFromPoint(Point inPoint) { short value; if (IsScrollBarVertical()) value=((inPoint.v-barZeroPosition) * (GetControlMaximum(scrollBar)-GetControlMinimum(scrollBar))) / barLength; else value=((inPoint.h-barZeroPosition) * (GetControlMaximum(scrollBar)-GetControlMinimum(scrollBar))) / barLength; value+=valueSlop; return value; }
void CalcChange(ControlHandle theControl, short *amount) { short value, max; value = GetControlValue(theControl); // get current value max = GetControlMaximum(theControl); // and maximum value *amount = value - *amount; if (*amount < 0) *amount = 0; else if (*amount > max) *amount = max; SetControlValue(theControl, *amount); *amount = value - *amount; // calculate the change }
SInt32 CalcValueFromPoint (ControlHandle hControl, Point thePoint) { /*Figure where we are in scroll bar terms.*/ SInt32 theValue = 0, theRange, theDistance, thePin; Rect rectControl, indicatorbounds; WindowPtr lpWindow; long thumbheight = 16; long thumbwidth = 16; RgnHandle indicatorregion = NewRgn (); long gTotalVSizeAdjust, gTotalWidthAdjust; short baselineoffset; GetControlRegion (hControl, kControlIndicatorPart, indicatorregion); GetRegionBounds (indicatorregion, &indicatorbounds); thumbheight = indicatorbounds.bottom - indicatorbounds.top; thumbwidth = indicatorbounds.right - indicatorbounds.left; DisposeRgn (indicatorregion); gTotalVSizeAdjust = ((kScrollArrowWidth * 2) + thumbheight); gTotalWidthAdjust = ((kScrollArrowWidth * 2) + thumbwidth); lpWindow = shellwindow; // (*hControl)->contrlOwner; zerorect (&rectControl); GetBestControlRect (hControl, &rectControl, &baselineoffset); //rectControl = (*hControl)->contrlRect; theRange = GetControlMaximum ( hControl ) - GetControlMinimum ( hControl ); if (flverticalscroll) { // Scroll distance adjusted for scroll arrows and the thumb theDistance = rectControl.bottom - rectControl.top - gTotalVSizeAdjust; // Pin thePoint to the middle of the thumb thePin = rectControl.top + (thumbheight / 2); thePin = lastpoint; theValue = ((thePoint.v - thePin) * theRange) / theDistance; } /*if*/ else { /*horizontal scrolling*/ theDistance = rectControl.right - rectControl.left - gTotalWidthAdjust; thePin = rectControl.left + (thumbwidth / 2); thePin = lastpoint; theValue = ((thePoint.h - thePin) * theRange) / theDistance; } /*else*/ theValue += gValueSlop; if ( theValue < GetControlMinimum ( hControl ) ) theValue = GetControlMinimum ( hControl ); else if ( theValue > GetControlMaximum ( hControl ) ) theValue = GetControlMaximum ( hControl ); return theValue; } /*CalcValueFromPoint*/