When the subject of scroll bars first came up in Chapter 2 while I was designing the SYSMETS series of programs, I discussed some of the differences between ”window scroll bars“ and ”scroll bar controls.“ SYSMETS uses window scroll bars, which appear at the right and bottom of the window. You add window scroll bars to a window by including the identifier WS_VSCROLL or WS_HSCROLL or both in the window style when creating the window. Now we're ready to make some scroll bar controls, which are child windows that can appear anywhere in the client area of the parent window. You create child window scroll bar controls by using the predefined window class ”scrollbar“ and one of the two scroll bar styles SBS_VERT and SBS_HORZ.
Unlike the button controls (and the edit and list box controls to be discussed later), scroll bar controls do not send WM_COMMAND messages to the parent window. Instead, they send WM_VSCROLL and WM_HSCROLL messages, just like window scroll bars. When processing the scroll bar messages, you can differentiate between window scroll bars and scroll bar controls by the high word of the lParam parameter:
Scroll Bar Type | HIWORD (lParam) |
Window scroll bar | 0 |
Scroll bar control | Window handle of control |
The wParam parameter and the low word of lParam have the same meaning for window scroll bars and scroll bar controls.
Although window scroll bars have a fixed width, Windows uses the full rectangle dimensions given in the CreateWindow call (or later in the MoveWindow call) to size scroll bar controls. You can make long, thin scroll bar controls or short, pudgy scroll bar controls. If you want to create scroll bar controls that have the same dimensions as window scroll bars, you can use GetSystemMetrics to obtain the height of a horizontal scroll bar:
GetSystemMetrics (SM_CYHSCROLL) ;
or the width of a vertical scroll bar:
GetSystemMetrics (SM_CXVSCROLL) ;
(The scroll bar window style identifiers SBS_LEFTALIGN, SBS_RIGHTALIGN, SBS_TOPALIGN, and SBS_BOTTOMALIGN are documented to give standard dimensions to scroll bars. However, these styles work only for scroll bars in dialog boxes.)
You can set the range and position of a scroll bar control with the same calls used for window scroll bars:
SetScrollRange (hwndScroll, SB_CTL, nMin, nMax, bRedraw) ;
SetScrollPos (hwndScroll, SB_CTL, nPos, bRedraw) ;
The difference is that window scroll bars use a handle to the parent window as the first parameter and SB_VERT or SB_HORZ as the second parameter.
The interior bar of the scroll bar is COLOR_SCROLLBAR. The thumb and arrow colors are based on the push button colors. If you trap WM_CTLCOLOR messages, you can return a brush from the message to override this color. Let's do it.