LỚP SCROLLBAR

Một phần của tài liệu Tài liệu Các đối tượng điều khiển docx (Trang 30 - 32)

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 (adsbygoogle = window.adsbygoogle || []).push({});

Một phần của tài liệu Tài liệu Các đối tượng điều khiển docx (Trang 30 - 32)