Trong các chương trước thanh cuộn cửa sổ được tạo ra bằng cách sử dụng hai thông số WS_VSCROLL hay WS_HSCROLL, thanh cuộn được tạo ra trong trường hợp này nằm ở bên dưới hoặc bên phải vùng client. Bây giờ tạo lập một control thanh cuộn mà kiểu điều khiển thanh cuộn này xuất hiện bất cứ nơi nào trong vùng thao tác. Bằng cách sử dụng lớp "scrollbar" cùng với hai kiểu thanh cuộn định nghĩa sẵn SBS_VERT và SBS_HORZ.
Không giống như các kiểu control điều kiển đã đề cặp ở trên, các control thanh cuộn ở đây không gởi thông điệp WM_COMMAND, mà lại gởi thông điệp
WS_VSCROLL và WS_ HSCROLL cho cửa sổ cha. Có thể phân biệt được
thanh cuộn cửa sổ và kiểu điều khiển thanh cuộn thông qua tham số lParam. Tham số này sẽ bằng 0 nếu như thanh cuộn này là thanh cuộn cửa sổ, còn tham số này sẽ bằng handle của cửa sổ thanh cuộn nếu như thanh cuộn đó là một kiểu điều khiển. Còn tham số wPram thì giống nhau cho cả hai loại thanh cuộn cửa sổ và kiểu điều khiển thanh cuộn.
Bạn có thể tạo một kiểu điều khiển thanh cuộn với chiều dài và chiều rộng tùy ý. Nếu bạn muốn tạo một kiểu điều khiển thanh cuộn có kích thước bằng kích thước của thanh cuộn cửa sổ. Thì dùng hai hàm sau để lấy chều cao và chiều rộng của thanh cuộn cửa sổ.
GetsystemMetrics (SM_CYHCROLL) ; GetsystemMetrics (SM_CXVCROLL) ;
Tương tự như thanh cuộn cửa sổ chúng ta có thể đặt vùng và vị trí cho kiểu điều khiển thanh cuộn hàm.
SetScrollRange (hwndScroll, SB_CTL, iMin, iMax, bRedraw) ;
hwnScroll là handle của control thanh cuộn. Tham số SB_CTL là một trong hai kiểu SBS_VERT tương ứng với thanh cuộn ngang và SBS_HORZ tương ứng với thanh cuộn đứng. Theo mặc định thì thanh cuộn nằm trong vùng có giá trị từ 0 đến 100 đơn vị chiều dài, tuy nhiên có thể đặt lại vùng thanh cuộn thông qua hai tham số iMin tương ứng với chặn dưới của vùng và iMax tương ứng với chặn trên của vùng. Tham số nRedraw mang một trong hai giá trị TRUE hoặc FALSE, nếu muốn Windows vẽ lại thanh cuộn dựa trên vùng mới thì phải đặt giá trị này bằng TRUE, còn ngược lại thì đặt giá trị này bằng FALSE.
Dùng hàm sau để đặt lại vị trí con chạy trên thanh cuộn.
SetScrollPos (hwndScroll, SB_CTL, iPos, bRedraw);
Với iPos là vị trí cần đặt con chạy trên vùng control thanh cuộn.
Giao diện bàn phím đối với thanh cuộn
Có thể dùng bàn phím để di chuyển con chạy trên vùng control thanh cuộn khi thanh cuộn đó nhận được focus nhập. Sau đây là các phím di chuyển cùng với các chức năng của nó trên control thanh cuộn.
Các phím di
chuyển Giá trị wParam của thông điệp thanh cuộn
Home SB_TOP
End SB_BOTTOM
Page Up SB_PAGEUP
Page Down SB_PAGEDOWN
Left hay Up SB_LINEUP
Right hay Down SB_LINEDOWN
Bảng Các giá trị wParam của thông điệp thanh cuộn
Đặt focus nhập cho các thanh cuộn bằng hàm.
SetFocus (hwndScroll);
Với hwnScroll là handle của control thanh cuộn. Muốn đặt focus cho một thanh cuộn nào đó khi khởi động chương trình thì phải đặt focus này khi xử lý thông điệp WM_SETFOCUS trong thủ tục WndProc. Vì lý do, thanh cuộn chỉ quan tâm đến các phím di chuyển, nó không quan tâm đến phím Tab. Điều này làm cho việc sử dụng phím Tab để di chuyển focus nhập từ thanh cuộn này đến thanh cuộn khác gặp nhiều khó khăn. Tuy nhiên để giải quyết vần đề này ta nguyên cứu các kỹ thuật sau.
Nhận địa chỉ thủ tục window của các control thanh cuộn bằng hàm
GetWindowLong với định danh GWL_ID. Bạn có thể đặt thủ tục Windows cho
thanh cuộn bằng hàm SetWindowLong với định danh GWL_WNDPROC. Trong ví dụ sau đây, hàm SetWindownLong đặt thủ tục window cho thanh cuộn mới và trả về địa chỉ thủ tục window thanh cuộn củ.
Ở hàm xử lý thanh cuộn ScrollProc trong ví dụ sau nhận tất cả các thông điệp gửi đến thủ tục window thanh cuộn. Hàm này chỉ đơn giản thay đổi focus nhập giữa các thanh cuộn khi bấm phím Tab hay Shift-Tab, bằng cách gọi window thanh cuộn củ thông qua Tô màu các thanh cuộn và các static text
Màu của các thanh cuộn được thực hiện bằng cách xử lý các thông điệp