Available in LEADTOOLS Imaging Pro, Vector, Document, and Medical Imaging toolkits. |
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);