Tải bản đầy đủ (.pdf) (5 trang)

Lớp combo box trong lập trình c trên windows (1)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (103.46 KB, 5 trang )

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
Bởi:
Khuyet Danh

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àm CreateWindow 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:

1/5




Lớp combo box trong lập trình c trên windows

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);


2/5


Lớp combo box trong lập trình c trên windows

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;

3/5


Lớp combo box trong lập trình c trên windows


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,
(HINSTANCE) GetWindowLong (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,
(HINSTANCE)
GetWindowLong
(hwnd,
GWL_HINSTANCE), NULL) ;

FillListBox (hwndCombo) ;
return 0 ;
4/5


Lớp combo box trong lập trình c trên windows

case WM_SETFOCUS :
SetFocus (hwndCombo) ;
return 0 ;
case WM_COMMAND :
if (LOWORD(wParam)
LBN_SELCHANGE)

==

ID_COMBO

&&

HIWORD(wParam)

==

{
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) ;
}

5/5



×