Implementing Scrollbars: Step 7

In the MainWndProc function, add code to process WM_HSCROLL and WM_VSCROLL messages.

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); 

Help Version 21.0.2023.2.15
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2021 LEAD Technologies, Inc. All Rights Reserved.

LEADTOOLS Raster Imaging C API Help
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2021 LEAD Technologies, Inc. All Rights Reserved.