Lớp list box lập trình c windows Lớp list box lập trình c windows Bởi: Khuyet Danh LỚP LIST BOX TRONG LẬP TRÌNH C TRÊN WINDOWS List box tập hợp chuỗi kí tự gói gọn hình chữ nhật Một chương trình thêm xóa chuỗi list box cách gởi thông điệp đến thủ tục window list box List box control gởi thông điệp WM_COMMAND đến cửa sổ cha có mục list box bị đánh dấu Cửa sổ cha xác nhận mục list box bị đánh dấu Một list box chọn mục hay nhiều mục lúc (tùy theo loại list box đơn hay kép) Các kiểu List Box Chúng ta tạo cửa sổ list box hàm CreateWindow với lớp cửa sổ "listbox" với loại cửa sổ WS_CHILD Tuy nhiên kiểu cửa sổ mặt định không gởi thông điệp WM_COMMAND đến cửa sổ cha, có nghĩa chương trình tự kiểm tra việc đánh dấu danh mục list box Vì thế, kiểu điều khiển list box thường định nghĩa kiểu list box LBS_NOTYFY, điều cho phép cửa sổ cha nhận thông điệp WM_COMMAND từ list box Nếu muốn xếp mục list box sử dụng kiểu LBS_SORT Theo mặc định, list box tạo list box đơn Vì thế, muốn tạo list box kép (tức list box cho phép người dùng chọn nhiều dòng lúc) phải sử dụng loại list box LBS_MULTIPLESEL.Thông thường, List box tự cập nhật mục thêm vào Tuy nhiên ngăn cản việc cập nhật kiểu LBS_NOREDRAW Việc làm không thích lắm, thay vào sử dụng thông điệp WM_SETREDRAW để ngăn chặn tạm thời việc vẽ lại list box Theo mặc định, mục list box đường viền bao quanh hiển thị hình Tuy nhiên, thêm đường viền cho mục định danh cửa sổ 1/8 Lớp list box lập trình c windows WS_BORDER Thêm cuộn đứng vào list box cách thêm định danh cửa sổ WS_VSCROLL Thông thường windows định nghĩa list box gồm thông số sau : LBS_NOTIFY | LBS_SORT | WS_VSCROLL | WS_BORDER Ngoài có thông số WS_SIZEBOX WS_CAPTION dùng để thay đổi kích thước thêm tiêu đề cho list box Nên tạo list box có chiều rộng chiều dài chuổi dài list box cộng với chiều dài cuộn dọc Chiều dài cuộn dọc xác định hàm GetSystemMetrics(SM_CXVCROLL); Đặt chuỗi vào List Box Để thêm chuỗi vào list box ta gởi thông điệp đến thủ tục Windows list box hàm SendMessage Khi truyền chuỗi cho hàm SendMessage thông số wParam trỏ, trỏ đến chuỗi kết thúc ký tự NULL Hàm SendMessage trả mã LB_ERRSPACE (giá trị -2) Windows chạy không gian nhớ dành cho list box Hàm SendMessage trả mã LB_ERR ( -1) xảy lỗi khác trả mã LB_OKAY ( ) thao tác thêm thành công Nếu sử dụng kiểu LBS_SORT thêm chuỗi vào list box cần dùng thị LB_ADDSTRING theo cấu trúc SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM) szString); Với szString chuỗi cần thêm vào list box Nếu list box không dùng kiểu LBS_SORT chèn chuỗi với thị LB_INSERTSTRING vị trí muốn chèn hàm SendMessage(hwndList, LB_INSERTSTRING, iIndex, (LPARAM) szString); iIndex vị trí muốn chèn chuỗi vào Nếu giá trị -1 chuỗi chèn vào đáy list box Xóa chuỗi list box thị LB_DELETESTRING SendMessage(hwndList, LB_DELETESTRING, iIndex, 0); Xóa hết phần tử nằm list box dùng thị LB_RESETCONTENT với cấu trúc 2/8 Lớp list box lập trình c windows SendMessage(hwndList, LB_LB_RESETCONTENT, 0, ); Khi thêm vào hay xóa Windows tự cập nhật lại list box Tuy nhiên ta tạm thời cản cập nhật cách tắt cờ vẽ lại list box SendMessage(hwndList, WMSETREDRAW, FALSE, 0); Sau thực xong ta bật cờ vẽ lại list box hàm SendMessage(hwndList, WMSETREDRAW, TRUE, 0); Chọn lấy mục List Box Tương tự đặt chuỗi vào List box , chọn lấy mục List box phải gởi thông điệp đến thủ tục Window List box hàm SendMessage Dùng thị LB_GETCOUNT để đếm số mục List box iCount = SendMessage (hwndList, LB_GETCOUNT, 0, ); Làm sáng mục chọn mặc định dùng LB_SETCURSEL SendMessage (hwndList, LB_SETCURSEL, iIndex, ); Nếu đặt giá trị iIndex -1 window bỏ tất mục chọn Để chọn mục dựa chữ bắt đầu mục, ta dùng hàm iIndex = SendMessage (hwndlist, LB_SELECTSTRING, iIndex, (LPARAM) szSearchString); iIndex vị trí bắt đầu việc tìm với kí tự đầu giống szSearchString Nếu giá trị iIndex -1 việc tìm vị trí Hàm trả giá trị tìm đượci Nếu chuỗi không tồn hàm trả mã lỗi LB_ERR Xác định mục chọn nhận thông điệp WM_COMMAND từ list box hàm iIndex = SendMessage(hwndList, LB_GETCURSEL, 0, 0); Hàm trả vị trí mục chọn, ngược lại mục chọn hàm trả mã lỗi LB_ERR Muốn xác định chiều dài chuỗi có list box dùng hàm 3/8 Lớp list box lập trình c windows iLength = SendMessage(hwndList, LB_GETTEXTLEN, iIndex, 0); Với iIndex ví trí chuỗi cần xác định chiều dài Để chép chuỗi vào vùng đệp Buffer, ta dùng hàm iLength = SendMessage(hwndList, LB_GETTEXT, iInde, (LPARAM) Buffer); Giá trị trả hai hàm chiều dài chuỗi ký tự Nên định kích thước vùng buffer cho đủ chứa chiều dài chuỗi cộng thêm ký tự kết thúc chuỗi cần ghi vào Tuy nhiên, list box chọn kép dùng thị LB_SETCURSEL, LB_GETCURSEL, LB_SELECTSTRING Thay vào phải dùng thị LB_SETSEL để chọn mục mà không làm ảnh hưởng đến mục chọn khác SendMessage(hwndList, LB_SETSEL, wParam, iIndex); Tham số wParam khác để chọn làm sáng mục, để hủy việc chọn Xác định trạng thái mục list box (loại list box chọn kép) dùng hàm iSelect = SendMessage(hwndList, LB_GETSEL, iIndex, 0); Hàm trả giá trị khác mục có vị trí iIndex chọn, mục vị trí không chọn Nhận thông điệp từ List Box Khi dùng chuột nhấn vào list box, list box nhận focus nhập Cửa sổ cha đặt focus nhập đến list box hàm SetFocus (hwndList); Khi list box nhận focus nhập, dùng chuột, phím chữ, phím Spacebar để chọn mục list box List box gởi thông điệp WM_COMMAND với thông số wParam, lParam đến cửa sổ cha với ý nghĩa : LOWORD (wParam) ID cửa sổ HIWORD (wParam) Mã thông báo lParam Handle cửa sổ 4/8 Lớp list box lập trình c windows Các giá trị mã thông báo Mã thông báo Giá trị Ý nghĩa LBN_ERRSPACE -2 Con trol list box chạy không gian LBN_SELCHANGE Cho biết mục chọn hành thay đổi LBN_DBLCLK Cho biết mục bị double click với chuột LBN_SELCANCEL Cho biết người dùng thay đổi mục chọn list box LBN_SETFOCUS Cho biết list box nhận focus nhập LBN_KILLFOCUS Cho biết list box focus nhập Mã thông báo LBN_ERRSPACE, LBN_SELCHANGE gởi đến cửa sổ cha kiểu cửa sổ list box bao gồm LBS_NOTIFY Một ứng dụng List Box Sau ví dụ list box, kết chương trình sau chạy thể hình 3.2 Trong ví dụ này, ta tạo list box gồm phần tử cam, chanh, nho… Khi dùng chuột hay dùng phím Spacebar cộng với phím mũi tên để chọn mục list box, mục chọn có màu tô thể chọn lựa (mặc định Windows màu xanh) nội dung mục chọn hiển thị lên kiểu điều khiển tĩnh nằm bên vùng thao tác cửa sổ Chương trình minh họa sau (ví dụ 3.2) Ứng dụng minh họa lớp List Box * LISTBOX.CPP (trích dẫn) #include #define ID_LIST 5/8 Lớp list box lập trình c windows #define ID_TEXT LRESULTCALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); void FillListBox (HWND hwndList) { int i; static TCHAR *tc[]={TEXT("cam"), TEXT("quyt"), TEXT("buoi"), TEXT("tao"), TEXT("chanh"), TEXT("xoai"), TEXT("nho")}; for(i=0; i