Lớp Combo Box Trong Lập Trình C Trên Windows

LỚP COMBO BOX TRONG LẬP TRÌNH C TRÊN WINDOWS

Cũng giống như List box, Combo box cũng là tập hợp các chuỗi kí tự được gói gọn trong một hình chữ nhật. Một chương trình có thể thêm hoặc xóa các chuỗi trong Combo box bằng cách gởi các thông điệp đến thủ tục window của Combo box. Combo box control gởi thông điệp WM_COMMAND đến cửa sổ cha khi có một mục trong Combo box được đánh dấu. Cửa sổ cha xác nhận mục được đánh dấu trong Combox box.
Trong Combox box chỉ cho phép chọn một mục trong danh sách các mục có trong Combo box.

Sự khác và giống nhau giữa Combo Box và List Box

Các thao tác trên list box và combo box là hoàn toàn giống nhau, chỉ khác nhau ở hình thức thể hiện. List box hiển thị các mục khi chúng được cập nhật, còn combo box chỉ hiển thị các mục khi ta nhấp chuột vào nó. Khi tạo kiểu điều khiển combo box với hàmCreateWindow phải sử dụng lớp cửa sổ "combobox" cùng với kiểu cửa sổ là WS_CHILD.
List box có thể cho phép chọn nhiều mục cùng lúc, còn combo box thì chỉ cho phép chọn một mục mà thôi.
Không giống như list box, combo box có hai phần. Phần dưới là danh sách các mục được thêm vào combo box, phần trên là một edit control dùng để hiển thị mục chọn hiện hành.

Thêm, xóa một chuỗi trênCombo Box

Để thêm một chuỗi vào combo box dùng hàm SendMessage với thông điệp CB_ADDSTRING:
SendMessage (hWnd, CB_ADDSTRING, 0, (LPARAM) szString);
hWnd là handle của Combo box control, szString là chuỗi cần thêm vào.
Hạn chế chiều dài của chuỗi cần thêm vào bằng thông điệp CB_LIMITTEXT.
SendMessage (hWnd, CB_LIMITTEXT, (WPARAM)length, 0).
length là chiều dài của chuỗi cần thêm vào không kể kí tự kết thúc chuỗi. Để chèn một chuỗi vào Combo box tại ví trí xác định, ta dùng thông điệp CB_INSERTSTRING.
SendMessage (hWnd, CB_INSERTSTRING, iIndex, (LPARAM) szString).
iIndex là vị trí cần chèn chuỗi vào Combo box. Để xóa tất cả các mục trong Combo box, ta dùng thông điệp CB_RESETCONTENT.
SendMessage (hWnd, CB_RESETCONTENT, 0, 0).
Tương tự, ta có thể xóa một mục trong Combo box bằng thông điệp CB_DELETESTRING.
SendMessage (hWnd, CB_DELETESTRING, iIndex, 0);

Chọn và lấy mục trên Combo box

Đếm số mục có trong Combo box bằng thông điệp CB_GETCOUNT.
iCount = SendMessage (hWnd, CB_GETCOUNT, 0, 0).
Hàm trên trả về số mục có trong Combo box. Thông thường ta chọn mục từ Combo box. Tuy nhiên, ta cũng có thể chọn mục bằng thông điệp CB_SETCURSEL.
SendMessage (hWnd, CB_SETCURSEL, (WPARAM) iIndex, 0).
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.
iIndex = SendMessage (hWnd, CB_GETCURSEL, 0, 0);
iIndex là vị trí của mục được chọn. 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).
Để xác định chiều dài iLength của một chuỗi có trong Combo box, ta dùng thông điệp CB_GETLBTEXTLEN.
iLength=SendMessage (hwnd, CB_GETLBTEXTLEN, iIndex, 0);
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.
SendMessage ( hWnd, CB_GETLBTEXT, iIndex, (LPARAM)szString);
iIndex là vị trí chuỗi cần lấy, szString dùng để chứa chuỗi lấy được.

Một ứng dụng Combo box

Để minh họa cách cách sử dụng Combo box cùng với các thủ tục xử lý thông điệp trong Combo box chúng ta cùng nhau khảo sát ví dụ sau (ví dụ 3.3). Kết quả thực hiện chương trình.

Ứng dụng minh họa lớp Combo Box

COMBOBOX.CPP ( trích dẫn)
void FillCombo (HWND hwndCombo)
{
int i;
static TCHAR *tc[ ] = {TEXT("MAI XUAN HUNG"), TEXT("LE HOAN VU"), TEXT("LE LU NHA"), TEXT("PHAM THANH PHONG"),TEXT("LE LUC"), TEXT("NGUYEN TIEN"), TEXT("DINH QUYEN")};
for(i=0; i<7; i++)
SendMessage(hwndCombo,CB_ADDSTRING,0,(LPARAM)tc[i]);
}
LRESULTCALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
staticHWND hwndCombo, hwndText ;
int iIndex, iLength, cxChar, cyChar ;
TCHAR *pVarName;
switch (message)
{
case WM_CREATE :
cxChar = LOWORD (GetDialogBaseUnits ()) ;
cyChar = HIWORD (GetDialogBaseUnits ()) ;
hwndCombo = CreateWindow (TEXT ("combobox"), NULL, WS_CHILD | WS_VISIBLE | LBS_STANDARD, cxChar, cyChar * 3, cxChar * 20 + GetSystemMetrics (SM_CXVSCROLL), cyChar * 10, hwnd, (HMENU)ID_COMBO, (HINSTANCEGetWindowLong(hwnd, GWL_HINSTANCE), NULL) ;
hwndText = CreateWindow (TEXT ("static"), NULL, WS_CHILD | WS_VISIBLE | SS_LEFT, cxChar, cyChar, GetSystemMetrics(SM_CXSCREEN), cyChar, hwnd, (HMENU) ID_TEXT, (HINSTANCEGetWindowLong (hwnd, GWL_HINSTANCE), NULL) ;
FillListBox (hwndCombo) ;
return 0 ;
case WM_SETFOCUS :
SetFocus (hwndCombo) ;
return 0 ;
case WM_COMMAND :
if (LOWORD(wParam) == ID_COMBO && HIWORD(wParam) == LBN_SELCHANGE)
{
iIndex=SendMessage(hwndCombo,CB_GETCURSEL,0,0);
iLength=SendMessage(hwndCombo,CB_GETLBTEXTLEN,iIndex, 0)+1;
pVarName =(char*) calloc (iLength, sizeof (TCHAR)) ;
SendMessage(hwndCombo, CB_GETLBTEXT, iIndex, (LPARAM)pVarName) ;
SetWindowText (hwndText, pVarName) ;
free (pVarName) ;
}
return 0 ;
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}

0 Comment:

Đăng nhận xét

Thank you for your comments!