Implementing Scrollbars: Step 4

case WM_HSCROLL:
/* Udpate the global rClientSize rectangle */
GetClientRect(hWnd,&rClientSize);
/* See how much the user wants to scroll */
switch (LOWORD(wParam))
{
/* Decrement by 10 percent */
case SB_LINELEFT:
nScrollInc = - XScrollRange / 10;
break;
/* Increment by 10 percent */
case SB_LINERIGHT:
nScrollInc = XScrollRange / 10;
break;
/* Decrement by client size */
case SB_PAGELEFT:
nScrollInc = - rClientSize.right;
break;
/* Increment by client size */
case SB_PAGERIGHT:
nScrollInc = rClientSize.right;
break;
/* Calculate the change in the THUMB position */
case SB_THUMBPOSITION:
nScrollInc = HIWORD(wParam) - XScrollPosition;
break;
/* No increment; so exit */
default:
return (0);
}

/* Limit the scroll increment to the amount available */
if (nScrollInc > 0)
nScrollInc = min(nScrollInc, (XScrollRange - XScrollPosition));
else
nScrollInc = max(nScrollInc, -XScrollPosition);
/* Update the global display rectangle */
OffsetRect (&rLeadDest,-nScrollInc, 0);
/* Scroll the client area */
ScrollWindow (hWnd,-nScrollInc, 0, NULL, NULL);
/* Calculate the new scroll position */
XScrollPosition += nScrollInc;
/* Prevent a background erase of the area uncovered by scrolling */
if (nScrollInc > 0)
{
SetRect(&ScrollRect, rClientSize.right - nScrollInc, 0,
rClientSize.right, rClientSize.bottom);
}
else
{
SetRect(&ScrollRect, 0, 0, -nScrollInc, rClientSize.bottom);
}
ValidateRect(hWnd, &ScrollRect);
InvalidateRect(hWnd, &ScrollRect, FALSE);

/* Set the new scroll position */
SetScrollPos (hWnd, SB_HORZ, XScrollPosition, TRUE);
/* Update the window */
UpdateWindow (hWnd);
return (0);
case WM_VSCROLL:
/* Udpate the global rClientSize rectangle */
GetClientRect(hWnd,&rClientSize);
/* See how much the user wants to scroll */
switch (LOWORD(wParam))
{
/* Decrement by 10 percent */
case SB_LINEUP:
nScrollInc = - YScrollRange / 10;
break;
/* Increment by 10 percent */
case SB_LINEDOWN:
nScrollInc = YScrollRange / 10;
break;
/* Decrement by client size */
case SB_PAGEUP:
nScrollInc = - rClientSize.bottom;
break;
/* Increment by client size */
case SB_PAGEDOWN:
nScrollInc = rClientSize.bottom;
break;
/* Calculate the change in the THUMB position */
case SB_THUMBPOSITION:
nScrollInc = HIWORD(wParam) - YScrollPosition;
break;
/* No increment; so exit */
default:
return (0);
}

/* Limit the scroll increment to the amount available */
if (nScrollInc > 0)
nScrollInc = min(nScrollInc, (YScrollRange - YScrollPosition));
else
nScrollInc = max(nScrollInc, -YScrollPosition);
/* Update the global display rectangle */
OffsetRect (&rLeadDest, 0, -nScrollInc);
/* Scroll the client area */
ScrollWindow (hWnd, 0, -nScrollInc, NULL, NULL);
/* Prevent a background erase of the area uncovered by scrolling */
if (nScrollInc > 0)
{
SetRect(&ScrollRect, 0, rClientSize.bottom - nScrollInc,
rClientSize.right, rClientSize.bottom );
}
else
{
SetRect(&ScrollRect, 0, 0, rClientSize.right,-nScrollInc);
}
ValidateRect(hWnd, &ScrollRect);
InvalidateRect(hWnd, &ScrollRect, FALSE);

/* Calculate the new scroll position */
YScrollPosition += nScrollInc;
/* Set the new scroll position */
SetScrollPos (hWnd, SB_VERT, YScrollPosition, TRUE);
/* Update the window */
UpdateWindow (hWnd);
return (0);