Khái niệm về các đối tượng điều khiển

MỤC LỤC

Cỏc thụng ủiệp ủến một lớp Edit Text

Cỏc thứ tự thụng ủiệp sau cho phộp cắt, sao chộp, xoỏ cỏc phần chữ ủược chọn (selected). WM_COPY sao chộp phần chữ ủó ủược ủỏnh dấu ủưa vào Clipboard nhưng phần ủỏnh dấu vẫn cũn trờn edit control. Chèn phần chữ nằm trong clipboard vào vùng soạn thảo edit control bằng cách gọi hàm.

LỚP LIST BOX

    Theo mặc ủịnh, cỏc mục trong list box khụng cú ủường viền bao quanh khi hiển thị trờn màn hỡnh. Thụng thường windows ủịnh nghĩa một list box gồm cỏc thụng số sau : LBS_NOTIFY | LBS_SORT | WS_VSCROLL | WS_BORDER. Ngoài ra cũn cú cỏc thụng số WS_SIZEBOX và WS_CAPTION dựng ủể thay ủổi kớch thước và thờm tiờu ủề cho list box.

    Khi truyền chuỗi cho hàm SendMessage thì thông số wParam là một con trỏ, trỏ ủến chuỗi ủược kết thỳc bởi ký tự NULL. Nếu sử dụng kiểu LBS_SORT thì khi thêm một chuỗi vào list box chỉ cần dùng chỉ thị LB_ADDSTRING theo cấu trúc. Nếu trong list box không dùng kiểu LBS_SORT thì có thể chèn một chuỗi với chỉ thị LB_INSERTSTRING cùng vị trí muốn chèn bằng hàm.

    Tương tự như ủặt chuỗi vào List box , chọn và lấy mục trong List box cũng phải gởi cỏc thụng ủiệp ủến thủ tục Window List box bằng hàm SendMessage. Hàm trả về vị trớ của mục ủược chọn, cũn ngược lại nếu khụng cú mục nào ủược chọn thỡ hàm trả về mã lỗi LB_ERR. Nờn ủịnh kớch thước vựng buffer sao cho ủủ chứa chiều dài của chuỗi cộng thờm ký tự kết thỳc chuỗi cần ghi vào.

    Thay vào ủú phải dựng chỉ thị LB_SETSEL ủể chọn một mục mà khụng làm ảnh hưởng ủến cỏc mục ủó chọn khỏc. Hàm trả về giỏ trị khỏc 0 nếu mục cú vị trớ iIndex ủược chọn, và bằng 0 nếu mục ở vị trớ ủú khụng ủược chọn. Khi list box nhận focus nhập, chỳng ta dựng con chuột, cỏc phớm chữ, phớm Spacebar ủể chọn cỏc mục trong list box.

    Mó thụng bỏo LBN_ERRSPACE, LBN_SELCHANGE ủược gởi ủến cửa sổ cha khi kiểu cửa sổ list box bao gồm LBS_NOTIFY. Sau ủõy là một vớ dụ về list box, kết quả chương trỡnh sau khi chạy thể hiện trong hỡnh 3.2. Khi dùng chuột hay dựng phớm Spacebar cộng với phớm mũi tờn ủể chọn cỏc mục trong list box, mục ủược chọn sẽ cú màu tụ thể hiện ủược chọn lựa (mặc ủịnh trong Windows là màu xanh) và nội dung mục chọn này ủược hiển thị lờn kiểu ủiều khiển tĩnh nằm bờn trờn vựng thao tỏc của cửa sổ chính.

    Khi dựng chuột hay bàn phớm chọn mục trong list box, thỡ list box gởi thụng ủiệp WM_COMMAND cho thủ tục WndProc của cửa sổ cha xử lý. Khi thủ tục WndProc nhận ủược thụng ủiệp WM_COMMAND, nú kiểm tra word thấp của tham số wParam cú bằng ủịnh danh của list box (ở ví dụ trên là ID_LIST) không và word cao của tham số wParam(mã thông bỏo) cú bằng LBN_SELCHANGE khụng.

    Bảng 3.3 Các giá trị của mã thông báo
    Bảng 3.3 Các giá trị của mã thông báo

    LỚP COMBO BOX

      Tương tự, ta cú thể xúa một mục trong Combo box bằng thụng ủiệp CB_DELETESTRING. Với iIndex là vị trớ cần chọn, nếu giỏ trị này bằng –1 thỡ Windows loại bỏ việc chọn ủối với tất cả các mục trong Combo box. Khi nhận thụng ủiệp WM_COMMAND từ Combo box, chỳng ta cú thể xỏc ủịnh mục ủược chọn cú vớ trớ thứ mấy trong Combo box (vị trớ bắt ủầu là 0) bằng cỏch dựng thụng ủiệp CB_GETCURSEL.

      Nếu khụng cú mục nào ủược chọn thỡ hàm trờn sẽ trả về mã lỗi CB_ERR (giá trị bằng –1). Hàm trả về chiều dài chuỗi với iIndex là ví trí của chuỗi cần lấy chiều dài. Nếu muốn lấy nội dung của mục nào ủú, ta sử dụng thụng ủiệp CB_GETLBTEXT.

      Hình 3.3 Ứng dụng minh họa lớp Combo Box
      Hình 3.3 Ứng dụng minh họa lớp Combo Box

      LỚP SCROLL BAR

        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. 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. Ở 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 hàm. Trong vớ dụ sau ở hàm WinProc ta ủịnh nghĩa một mảng gồm cú 3 phần tử mỗi phần tử là một handle chổi tô (brush) cho một thanh cuộn. Chỳ ý : Cỏc chổi tụ phải ủược hủy bỏ trước khi kết thỳc chương trỡnh thụng qua hàm DeleteOject khi xử lý thụng ủiệp WM_DESTROY trong thủ tục xử lý WinProc.

        Cỏc static text ủược tụ màu tương tự như cỏc thanh cuộn, bằng cỏch xử lý thụng ủiệp WM_CTLCOLORSTATIC trong thủ tục WinProc thông qua hàm SetTextColor. Dùng hàm SetBkColor ủể ủặt màu nền chữ, trong vớ dụ sau thỡ màu nền chữ trựng với màu hệ thống COLOR_BTNHIGHLIGHT. Khi thay ủổi việc chọn trờn cỏc thanh cuộn thỡ chương trỡnh tạo ra một chổi tụ (brush) mới và chốn handle của chổi tụ mới này vào cửa sổ ở trờn.

        Có thể tạo một chổi tô (brush) mới và chốn handle của chổi tụ này vào cấu trỳc của cửa sổ, sau ủú xúa chổi tụ (brush) cũ. Hàm InvalidateRect làm cho window ủặt thụng ủiệp WM_PAINT vào trong hằng ủợi cỏc thụng ủiệp của thủ tục xử lý window. Mà thụng ủiệp WM_PAINT cú ủộ ưu tiờn thấp hơn cỏc thụng ủiệp xử lý bàn phớm hay chuột nờn nú ủược xử lý sau.

        Nếu muốn vựng cửa sổ ủược cập nhật lại màu ngay sau khi di chuyển con chạy trên thanh cuộn thì dùng hàm. Như chỳng ta biết windows xử lý mặc ủịnh thụng ủiệp WM_PAINT chỉ ủơn giản là lời gọi hàm BeginPaint và EndPaint. Nhưng ở trờn chỳng ta chỉ ủịnh InvalidateRect là phần nền cần phải xúa, chớnh ủiều này hàm BeginPaint sẽ khiến cho Windows tự ủộng phỏt sinh thụng ủiệp xúa nền WM_ERASEBKGND.

        Chú ý : phải dọn dẹp các chổi tô trước khi chương trình kết thúc bằng hàm DeleteOject trong khi xử lý thụng ủiệp WM_DESTROY. Ba stactic text ở dưới mỗi thanh cuộn dựng ủể ghi nhận giỏ trị màu thay ủổi tương ứng với các thanh cuộn.

        Bảng 3.4 Cỏc giỏ trị wParam của thụng ủiệp thanh cuộn
        Bảng 3.4 Cỏc giỏ trị wParam của thụng ủiệp thanh cuộn