MRESULT EXPENTRY MpmFnwpScrollBar( hwnd, msg, mp1, mp2 ) HWND hwnd; USHORT msg; MPARAM mp1; MPARAM mp2; { USHORT id; ControlHandle hctl, hctl1; Rect rect; Rect* prect; SHORT sPart; POINTL ptl; SHORT cmd; Handle hcdef; LONG lPoint; Point point; static BOOL fTrackThumb = FALSE; static SHORT sInitValue; if( ! MpmValidateWindow(hwnd) ) return FALSE; id = MYWNDOF(hwnd).id; hctl = MYWNDOF(hwnd).hctl; switch( msg ) { /* Return the current position */ case SBM_QUERYPOS: return MRFROMSHORT( fTrackThumb ? sInitValue : (**hctl).contrlValue ); /* Return the scroll bar range */ case SBM_QUERYRANGE: return MRFROM2SHORT( (**hctl).contrlMin, (**hctl).contrlMax ); /* Set the scroll bar position and range */ case SBM_SETSCROLLBAR: (**hctl).contrlMin = SHORT1FROMMP(mp2); (**hctl).contrlMax = SHORT2FROMMP(mp2); /* fall through */ /* Set the scroll bar position only */ case SBM_SETPOS: if( MYWNDOF(hwnd).flStyle & WS_VISIBLE ) SetCtlValue( hctl, SHORT1FROMMP(mp1) ); else (**hctl).contrlValue = SHORT1FROMMP(mp1); fTrackThumb = FALSE; return MRFROMSHORT(1); /* Handle mouse button down: call TrackControl to track it */ case WM_BUTTON1DOWN: ptl.x = SHORT1FROMMP(mp1); ptl.y = SHORT2FROMMP(mp1); MpmMapMacOfPtl( hwnd, &point, &ptl ); sPart = FindControl( point, PWINOFHWND(hwnd), &hctl1 ); ASSERT( sPart && hctl1 == hctl, "MpmFnwpScrollBar: FindControl failed" ); _hwndTrack = hwnd; if( sPart == inThumb ) { fTrackThumb = TRUE; sInitValue = (**hctl).contrlValue; if( TrackControl( hctl, point, NULL ) ) MpmTrackScrollBarNotify( SB_SLIDERPOSITION ); fTrackThumb = FALSE; } else { TrackControl( hctl, point, (ProcPtr)MpmTrackScrollBar ); MpmTrackScrollBarNotify( SB_ENDSCROLL ); } return 0L; /* Handle scroll bar creation: call NewControl to create it */ case WM_CREATE: rect.left = rect.top = 0; if( MYWNDOF(hwnd).flStyle & SBS_VERT ) rect.right = _alSysVal[SV_CXVSCROLL], rect.bottom = 100; else rect.bottom = _alSysVal[SV_CYHSCROLL], rect.right = 100; hctl = NewControl( PWINOFHWND(hwnd), &rect, _szNull, MYWNDOF(hwnd).flStyle & WS_VISIBLE, 0, 0, 1, scrollBarProc, (long)hwnd ); if( ! hctl ) return MRFROMSHORT(1); MYWNDOF(hwnd).hctl = hctl; return 0L; /* Destroy scroll bar */ case WM_DESTROY: MYWNDOF(hwnd).hctl = NULL; DisposeControl( hctl ); return 0L; /* Handle window movement: use MoveControl to move the bar */ case WM_MOVE: MpmQueryMacRect( hwnd, &rect ); if( MYWNDOF(hwnd).flStyle & WS_VISIBLE ) MoveControl( hctl, rect.left, rect.top ); else { prect = &(**hctl).contrlRect; prect->right += rect.left - prect->left; prect->left = rect.left; prect->bottom += rect.top - prect->top; prect->top = rect.top; } return 0L; /* Show or hide the scroll bar */ case WM_SHOW: if( mp1 ) ShowControl( hctl ); else HideControl( hctl ); return 0L; /* Handle window resizing: use SizeControl to resize it */ case WM_SIZE: if( SHORT1FROMMP(mp2) && SHORT2FROMMP(mp2) ) { if( MYWNDOF(hwnd).flStyle & WS_VISIBLE ) SizeControl( hctl, SHORT1FROMMP(mp2), SHORT2FROMMP(mp2) ); else { prect = &(**hctl).contrlRect; prect->right = prect->left + SHORT1FROMMP(mp2); prect->bottom = prect->top + SHORT2FROMMP(mp2); } } return 0L; } return WinDefWindowProc( hwnd, msg, mp1, mp2 ); }