CHƯƠNG 3 CÁC ĐỐI TƯỢNG ĐIỀU KHIỂN

33 464 0
CHƯƠNG 3 CÁC ĐỐI TƯỢNG ĐIỀU KHIỂN

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

CHƯƠNG CÁC ĐỐI TƯỢNG ĐIỀU KHIỂN 3.1 MỞ ĐẦU Các đối tượng điều khiển (control) thành phần tương tác trực quan, thể rõ chế giao tiếp đồ họa ứng dụng người dùng Nhờ đối tượng này, chương trình ứng dụng Windows trở nên thân thiện dễ dùng Ví thế, chúng thành phần thiếu hầu hết ứng dụng Trong chương này, tìm hiểu tạo lập xử lý cho đối tượng điều khiển thông qua lớp (class) sau : • Lớp Button (nút bấm) • Lớp Static (tĩnh) • Lớp Edit Box (soạn thảo) • Lớp List Box (danh sách) • Lớp Combo Box • Lớp Scroll Bar (thanh cuộn) 3.2 GIỚI THIỆU TỔNG QUAN Một kiểu điều khiển xem cửa sổ Có thể tạo nhiều cửa sổ cửa sổ cha Các cửa sổ xác định handle cửa sổ cha cách gọi hàm : hwndParent = GetParent (hwnd); hwnd handle cửa sổ cần lấy handle cửa sổ cha Và lấy handle cửa sổ cha, cửa sổ có quyền gởi thơng điệp đến cửa sổ cha thông qua hàm SendMessage(hwndParent, message, wParam, lParam); message thông điệp cần gởi đến thủ tục xử lý cửa sổ cha wParam danh ID cửa sổ con, lParam ghi lại trạng thái cửa sổ Vậy tạo thành phần điều khiển dạng cửa sổ hay gọi "child window control" Cửa sổ có nhiệm vụ xử lý thơng điệp bàn phím, thơng điệp chuột thông báo cho cửa sổ cha trạng thái cửa sổ thay đổi Như cửa sổ trở thành công cụ giao tiếp (cho phép nhập xuất) người dùng với chương trình Tuy tạo cửa sổ cho mình, nên tận dụng lớp cửa sổ Windows định nghĩa sẵn hay gọi kiểu điều khiển chuẩn Những kiểu điều khiển chuẩn thường nút bấm (button), hộp kiểm tra (check box), hộp soạn thảo (edit box), hộp danh sách (list box), combo box, cuộn chuỗi chữ Ví dụ muốn tạo nút bấm hình cần gọi hàm CreateWindows, mà chẳng cần phải quan tâm đến cách vẽ, cách nhận chuột chớp bị kích hoạt Tất điều Windows xử lý Điều quan trọng làphải chặn thông điệp WM_COMMAND điều khiển để xử lý thông điệp theo mục đích khác Các kiểu điều khiển thường dùng hộp thoại Như minh họa chương 2, điều khiển nhận hộp thoại làm cửa sổ cha Tuy nhiên, tạo kiểu điều khiển trực tiếp vùng cửa sổ chính, cách gọi hàm CreateWindow điều chỉnh vị trí với kích thước cho thích hợp hàm MoveWindow Thủ tục xử lý thông điệp cửa sổ cha gửi thông điệp đến khiểu điều khiển con, ngược lại child window control gởi thông điệp để yêu cầu cửa sổ cha xử lý thơng điệp Để tạo cửa sổ ứng dụng bình thường Đầu tiên phải đăng ký lớp cửa sổ hàm RegisterClass Tiếp theo khởi tạo lớp đăng ký thơng qua hàm CreateWindow Cịn trường hợp muốn tạo lớp định nghĩa sẵn khơng cần đăng ký cho lớp cửa sổ muốn tạo Sử dụng kiểu điều khiển trực tiếp cửa sổ địi hỏi tác vụ cấp thấp so với dùng kiểu điều khiển hộp thoại Và kiểu điều khiển tạo cửa sổ khơng có hỗ trợ tiện ích Ví dụ khơng thể sử dụng phím bấm tab để chuyển focus kiểu điều khiển với 3.3 LỚP BUTTON Để tìm hiểu kiểu điều khiển, xem xét ví dụ 3.1 sau Trong ví dụ tạo cửa sổ chuẩn cửa sổ cha hình 3.1 Hình 3.1 Minh họa lớp Button Nhấp chuột vào nút, lúc nút gởi thơng điệp WM_COMMAND đến thủ tục xử lý thông điệp WndProc cửa sổ cha Thủ tục WndProc xử lý in hình thơng số lParam wParam thơng điệp gởi tới này.Trong lParam handle cửa sổ gởi thông điệp đến cửa sổ cha wParam có hai phần LOWORD HIWORD, LOWORD cho biết ID cửa sổ con, HIWORD mã thông báo Mã thông báo nút bấm giá trị sau Định danh mã thông báo Button Giá trị BN_CLICKED BN_PAINT BN_HILETE hay BN_PUSHED BN_UNHILITE hay BN_UNPHUSHED BN_DISABLE BN_DOUBLECLICKED hay BN_DBCLICK BN_SETFOCUS BN_KILLFOCUS Bảng 3.1 Định danh mã thông báo Button Không thấy giá trị nút bấm, biết giá trị từ đến dành cho kiểu button BS_USERBUTTON, giá trị dành cho kiểu BS_RADIOBUTTON, BS_AUTORADIOBUTTON, BS_OWNEDRAW, hay nút bấm khác nút bấm bao gồm kiểu BS_NOTYFY Giá trị 5,6 dành cho kiểu nút bấm bao gồm cờ NOTYFY Sau chương trình *CONTROL1.CPP (trích dẫn) struct { int iStyle ; TCHAR *szText ; } button[ ] = { BS_PUSHBUTTON, TEXT ("PUSHBUTTON"), BS_DEFPUSHBUTTON, TEXT ("DEFPUSHBUTTON"), BS_CHECKBOX, TEXT ("CHECKBOX"), BS_AUTOCHECKBOX, TEXT ("AUTOCHECKBOX"), BS_RADIOBUTTON, TEXT ("RADIOBUTTON"), BS_3STATE, TEXT ("3STATE"), BS_AUTO3STATE, TEXT ("AUTO3STATE"), BS_GROUPBOX, TEXT ("GROUPBOX"), BS_AUTORADIOBUTTON, TEXT ("AUTORADIO") }; #define NUM (sizeof(button) / sizeof(button[0])) LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hwndButton[NUM] ; static RECT rect ; static TCHAR szTop[] = TEXT("message wParam lParam"), szUnd[] = TEXT(" _ "), szFormat[] = TEXT("%-16s%04X-%04X %04X-%04X"), szBuffer[50]; static int cxChar, cyChar ; HDC hdc ; PAINTSTRUCT ps ; int i ; switch (message) { case WM_CREATE : cxChar = LOWORD(GetDialogBaseUnits()) ; cyChar = HIWORD(GetDialogBaseUnits()) ; for (i = ; i < NUM ; i++) hwndButton[i] = CreateWindow(TEXT("button"), button[i].szText, WS_CHILD|WS_VISIBLE| button[i].iStyle, cxChar, cyChar*(1+2*i), 20*cxChar, 7*cyChar/4, hwnd, (HMENU)i, ((LPCREATESTRUCT)lParam)->hInstance, NULL) ; return ; case WM_SIZE : rect.left = 24*cxChar ; rect.top = 2*cyChar ; rect.right = LOWORD(lParam) ; rect.bottom = HIWORD(lParam) ; return ; case WM_PAINT : InvalidateRect (hwnd, &rect, TRUE) ; hdc = BeginPaint (hwnd, &ps) ; SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT)); SetBkMode (hdc, TRANSPARENT) ; TextOut (hdc, 24 * cxChar, cyChar, szTop, lstrlen (szTop)); TextOut (hdc, 24 * cxChar, cyChar, szUnd, lstrlen (szUnd)) ; EndPaint (hwnd, &ps) ; return ; case WM_DRAWITEM : case WM_COMMAND : ScrollWindow (hwnd, 0, -cyChar, &rect, &rect) ; hdc = GetDC (hwnd) ; SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT)); TextOut (hdc, 24*cxChar, cyChar*(rect.bottom/cyChar-1), szBuffer, wsprintf (szBuffer, szFormat, message==WM_DRAWITEM ? TEXT ("WM_DRAWITEM") : TEXT ("WM_COMMAND"), HIWORD (wParam), LOWORD (wParam), HIWORD (lParam), LOWORD (lParam))) ; ReleaseDC (hwnd, hdc); ValidateRect (hwnd, &rect); break; case WM_DESTROY : PostQuitMessage(0) ; return ; } return DefWindowProc (hwnd, message, wParam, lParam) ; } Để tạo child window control bạn dùng cấu trúc CreateWindow với thơng số sau • Tên lớp : TEXT ("button") • Text cửa sổ : Button[i].szText • Kiểu cửa sổ : WS_CHILD | WS_VISIBLE | button[i].iStyle • Vị trí x : cxChar • Vị trí y : cyChar*( 1+2*i ) • Chiều rộng : 20*xChar • Chiều cao : 7*yChar*4 • Handle cửa sổ cha : hwnd • Chỉ danh cửa sổ : (HMENU) i • Thẻ quản Handle : ((LPCREATESTRUCT) lParam-> hInstance, NULL) ; • Các thơng số thêm : NULL Trong tên lớp cố định Tên cửa sổ đặt Kiểu cửa sổ sử dụng WS_CHILD, WS_VISIBLE kiểu button (BS_PUSHBUTTON, BS_CHECKBOX, ) Tiếp theo thơng số xác định ví trí x, ví trí y, kích thước theo chiều rộng, kích thước chiều cao cửa sổ vùng client cửa sổ cha hwnd handle cửa sổ cha ID danh cửa sổ (mỗi cửa sổ có số ID) ID phải ép kiểu HMENU để định trình đơn lParam thực chất trỏ đến cấu trúc LPCREATESTRUCT có thành phần hInstance Dó muốn lấy thẻ quản hInstance phải ép kiểu lParam 3.3.1 Lớp Push Button Trong ví dụ 3.1 có hai Push Button tạo hàm CreateWindow với kích thước ví trí xác định người lập trình Các Push Button sử dụng để bật tắt hành động tức thời không giữ trạng thái bật hay tắt lâu dài checkbox Trên hai kiểu cửa sổ BS_PUSHBUTTON BS_DEFBUTTON (kiểu nút bấm mặc định) Hai kiểu thiết kế khác sử dụng có chức hoàn toàn giống Khi nhấn chuột vào nút nút gởi thơng điệp WM_COMMAND đến cửa sổ cha với mã thơng báo BN_CLICK Có thể tác động đến nút bấm cách gọi hàm SendMessage( hwndButton, BM_SETSTASE, 1, ); Nếu muốn nút nhấn trở lại trạng thái bình thường gọi hàm : SendMessage(hwndButton, BM_SETSTASE, 0, ); hwndButton định danh cửa sổ trả hàm CreateWindow 3.3.2 Lớp Check Box Một check box là hộp vuông kèm theo chữ Thông thường chữ nằm bên trái hộp Tuy nhiên, đặt chữ nằm bên phải cách thêm vào kiểu BS_LEFTTEXT tạo button Các check box cho phép người dùng chọn tùy chọn, hoạt động cơng tắc Có hai loại check box thơng dụng BS_CHECKBOX BS_AUTOCHECKBOX Khi sử dụng loại BS_CHECKBOX, tự đặt dấu check box cách gởi đến kiểu điều khiển thông điệp BS_SETCHECK Thông số wParam hàm SendMessage đặt giá trị để tạo đánh dấu, muốn hủy đánh dấu Lấy trạng thái check box cách gởi đến kiểu điều khiển thông điệp BM_GETCHECK Dùng đoạn chương trình sau để bật tắt dấu check xử lý thông điệp WM_COMMAND gởi đến từ kiểu điều khiển SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)!SendMessage( (HWND)lParam, BM_GETCHECK, 0, 0), 0); Chú ý toán tử ! (NOT) đứng trước hàm SendMessage Giá trị lParam handle cửa sổ gởi đến cửa sổ cha thông điệp WM_COMMAND Muốn biết trạng thái check box gởi tới thơng điệp BM_GETCHECK Để khởi động check box loại BS_CHECKBOX với trạng thái đánh dấu, cách gởi đến thơng điệp BM_SETCHECK theo cấu trúc SendMessage (hwndButton,BM_SETCHECK, 1, 0); Còn check box BS_AUTOCHECK loại nút bấm mà tự đánh dấu bật hay tắt cho Muốn lấy trạng thái check box hành, cần gởi thông điệp BM_GETCHECK đến kiểu điều khiển theo cấu trúc iCheck = SendMessage (hwndButton, BM_SETCHECK, 1, 0); iCheck mang giá trị TRUE check box trạng thái chọn, ngược lại iCheck mang giá trị FALSE Ngồi cịn có hai loại check box khác BS_3STATE BS_AUTO3STATE Hai loại có thêm trạng thái thứ 3, trạng thái nút check box có màu xám xuất bạn gởi thông điệp WM_SETCHECK với tham số wParam đến check box Màu xám cho biết người dùng chọn lựa khơng thích hợp hay khơng xác định 3.3.3 Lớp Radio Button Một radio button vòng tròn có kèm theo chữ Tại thời điểm có radio button nhấn Các radio thường nhóm lại để sử dụng cho việc lựa chọn nhóm Trạng thái radio button khơng bật tắt check box Có nghĩa, nhấn chuột vào radio button button đánh dấu, ta nhấn chuột vào lần radio trạng thái đánh dấu Có hai kiểu radio button BS_RADIOBUTTON BS_AUTORADIOBUTTON, kiểu thứ hai sử dụng hộp thoại Khi nhận thông điệp WM_COMMAND từ radio button, phải đánh dấu radio cách gởi thơng điệp BM_SETCHECK với thơng số wParam sau SendMessage(hwndButton, BM_SETCHECK, 1, 0); Tất radio button nhóm, bạn muốn tắt dấu check bạn gởi đến chúng thông điệp BM_SETCHECK với thông số wParam sau SendMessage(hwndButton, BM_SETCHECK, 0, 0); 3.3.4 Lớp Group Box Group box có kiểu BS_GROUPBOX, loại button đặc biệt Một group box đơn giản đường viền có dịng tiêu đề đỉnh Group box khơng xử lý thơng điệp bàn phím, khơng xử lý thông điệp chuột không gởi thông điệp WM_COMMAND đến cửa sổ cha Các group box thường sử dụng bao quanh kiểu điều khiển khác 3.4 LỚP STATIC Tạo lớp tĩnh cách sử dụng "static" tạo lớp cửa sổ hàm CreateWindow Lớp tĩnh không nhận nhập liệu từ bàn phím từ chuột, khơng gởi thơng điệp WM_COMMAND đến cửa sổ cha Khi di chuyển hay nhấn chuột vào cửa sổ tĩnh, cửa sổ bẫy thông điệp WM_NCHITTEST trả giá trị HTTRANSPARENT đến Windows Điều làm cho Windows gởi thông điệp WM_NCHITTEST cho cửa sổ cha Cửa sổ cha thường gởi thông điệp đến thủ tục DefWindowProc Các kiểu cửa sổ tĩnh sau dùng để vẽ hình chữ nhật hay khung lên vùng client cửa sổ Các kiểu FRAME đường bao hình chữ nhật, kiểu RECT hình chữ nhật : SS_BLACKRECT, SS_GRAYRECT, SS_ WHITERECT SS_BLACKFRAME, SS_GRAYFAME, SS_WHITEFRAME 3.5 LỚP EDIT TEXT Trong phương diện lớp soạn thảo (edit text) xem cửa sổ định nghĩa sẵn đơn giản Nhưng xét khía cạnh khác lại phức tạp Dùng tên lớp "edit" với thông số ví trí x, vị trí y, chiều rộng, chiều cao hàm CreateWindow để tạo cửa sổ soạn thảo Khi cửa sổ soạn thảo nhận focus gõ chữ vào, xố chữ, đánh dấu chữ…vv Các thao tác Windows hỗ trợ hoàn toàn Một ứng dụng thường xuyên nhất, đơn giản lớp soạn thảo tạo cửa sổ cho phép người dùng nhập chữ vào Để minh họa cho cửa sổ nhập ta xét ví dụ 3.2 sau *EDITTEXT.CPP #include #define ID_EDIT LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); TCHAR szAppName[] = TEXT ("PopPad1") ; LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hwndEdit ; switch (message) { case WM_CREATE : hwndEdit = CreateWindow (TEXT("edit"), NULL, WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | WS_BORDER | ES_LEFT | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL, 0, 0, 0, 0, hwnd, (HMENU)ID_EDIT, ((LPCREATESTRUCT) lParam) -> hInstance, NULL) ; return ; case WM_SETFOCUS : SetFocus (hwndEdit) ; return ; case WM_SIZE : MoveWindow (hwndEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE); return ; case WM_COMMAND : if (LOWORD (wParam) == ID_EDIT) if ( HIWORD(wParam)==EN_ERRSPACE || HIWORD(wParam)==EN_MAXTEXT ) MessageBox(hwnd, TEXT("Edit control out of space."), szAppName, MB_OK | MB_ICONSTOP) ; return ; case WM_DESTROY : PostQuitMessage(0) ; return ; } return DefWindowProc (hwnd, message, wParam, lParam) ; } Hạn chế edit box định nghĩa sẵn số ký tự người dùng nhập vào phải không 30.000 ký tự chữ 3.5.1 Các kiểu lớp Edit Text Trong ví dụ tạo edit box cách gọi hàm CreateWindow Có kiểu cửa sổ WS_CHILD, số tùy chọn Chúng ta canh trái, phải, chữ vùng cửa sổ edit box cách thay đổi thông số kiểu cửa sổ ES_LEFT, ES_RIGHT, ES_CENTER hàm CreateWindow Có thể tạo edit control cho phép hiển thị nhiều hàng cách chọn kiểu cửa sổ ES_MULTILINE Một edit control mặc định cho phép nhập hàng ký tự cuối edit box Sử dụng ES_AUTOHSCROLL, ES_AUTOVSCROLL để tạo edit control có cuộn ngang, cuộn đứng tự động Có thể thêm cuộn ngang đứng vào edit control cách sử dụng kiểu cửa sổ WS_HSCROLL, WS_VSCROLL Dùng kiểu cửa sổ WS_BORDER để tạo đường viền cho edit control Kích thước edit control xác định cách gọi hàm MoveWindow hàm WndProc xử lý thơng điệp WM_SIZE Trong ví dụ kích thước edit control đặt kích thước cửa sổ MoveWindow(hwndEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE); Các edit control gởi thông điệp WM_COMMAND thông số wParam, lParam đến window cửa sổ cha Với ý nghĩa : LOWORD(wParam) ID cửa sổ con, HIWORD(wParam) mã thông báo lParam handle edit control Mã thông báo ý nghĩa EN_SETFORCUS Endit control nhận focus nhập EN_KILLFORCUS Endit control focus nhập EN_CHANGE Nội dung edit control thay đổi EN_UPDATE Nội dung edit control thay đổi EN_ERRSPACE Edit control chạy thời gian EN_MAXTEXT Edit control chạy không gian chèn EN_HSCROLL Thanh cuộn đứng edit control bị tác động EN_VSCROLL Thanh cuộn nằm edit control bị tác động Bảng 3.2 Danh sách mã thông báo edit Control 3.5.2 Các thông điệp đến lớp Edit Text Các thứ tự thơng điệp sau cho phép cắt, chép, xố phần chữ chọn (selected) SendMessage (hwndEdit, WM_CUT, 0, 0); SendMessage (hwndEdit, WM_COPY, 0, 0); SendMessage (hwndEdit, WM_CLEAR, 0, 0); Với WM_CUT cắt phần chữ đánh dấu đưa vào vùng Clipboard WM_COPY chép phần chữ đánh dấu đưa vào Clipboard phần đánh dấu cịn edit control WM_CLEAR xóa phần chữ đánh dấu mà không đưa vào clipboard Chèn phần chữ nằm clipboard vào vùng soạn thảo edit control cách gọi hàm SendMessage (hwndEdit, WM_PASTE , 0, 0); Nhận bắt đầu kết thúc phần chữ chọn cách gọi hàm : SendMessage (hwndEdit, EM_GETSEL, (WPARAM)&iStart, (LPARAM)&iEnd ); iStart lưu vị trí bắt đầu iEnd lưu ví trí kết thúc Để thay phần chữ chọn chữ khác, ta dùng hàm ; SendMessage(hwndEdit,EM_REPLACESEL,0,(LPARAM)szString); Trong szString chuỗi muốn thay Đối với edit control nhiều dòng, ta đếm số dòng chữ hàm iCount = SendMessage (hwndEdit, EM_GETLINECOUNT, 0, 0); Các dòng edit control đánh số bắt thứ tự từ Lấy chiều dài dòng lệnh iLength = SendMessage (hwndEdit, EM_LINELENGTH, iLine, 0) Chép hàng vào đệm cách gọi hàm iLength = SendMessage ( hwdEdit, EM_GETLINE, iLine, (LPARAM)Buffer ) 3.6 LỚP LIST BOX 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) 3.6.1 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 khơng có đườ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ổ 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ịn 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); 3.6.2 Đặ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 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); 3.6.3 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, cịn ngược lại khơng có 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 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 khơng thể 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 3.6.4 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ổ Mã thông báo Giá trị Ý nghĩa LBN_ERRSPACE -2 Con trol list box chạy không gian SetScrollRange(hwndScroll[i], SB_CTL, 0, 255, FALSE); SetScrollPos (hwndScroll[i], SB_CTL, 0, FALSE) ; hwndLabel[i] = CreateWindow ( TEXT("static"), szColorLabel[i], WS_CHILD|WS_VISIBLE| SS_CENTER, 0, 0, 0, 0, hwnd, (HMENU) (i + 3), hInstance, NULL) ; hwndValue [i] = CreateWindow (TEXT ("static"), TEXT ("0"), WS_CHILD | WS_VISIBLE | SS_CENTER, 0, 0, 0, 0, hwnd, (HMENU) (i + 6), hInstance, NULL) ; OldScroll[i] = (WNDPROC) SetWindowLong ( hwndScroll[i], GWL_WNDPROC, (LONG) ScrollProc) ; hBrush[i] = CreateSolidBrush (crPrim[i]) ; } hBrushStatic = CreateSolidBrush ( GetSysColor (COLOR_BTNHIGHLIGHT)) ; cyChar = HIWORD (GetDialogBaseUnits ()) ; return ; case WM_SIZE : cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ; SetRect (&rcColor, 0, 0, cxClient/1.5, cyClient) ; MoveWindow (hwndRect, cxClient/1.5, 0, cxClient/2, cyClient, TRUE) ; for (i = ; i < ; i++) { MoveWindow (hwndScroll[i], ((int)(1.2 * i + 1) * cxClient) / 13 + (int)cxClient/1.5, 2*cyChar, cxClient / 17, cyClient - * cyChar, TRUE) ; MoveWindow (hwndLabel[i], (2.3 * i + 1) * cxClient / 28+ cxClient/1.5, cyChar / 2, cxClient / 8, cyChar, TRUE) ; MoveWindow (hwndValue[i], (2.3 * i + 1) * cxClient / 28+ cxClient/1.5, cyClient - * cyChar / 2, cxClient / 8, cyChar, TRUE) ; } SetFocus (hwnd) ; return ; case WM_SETFOCUS : SetFocus (hwndScroll[idFocus]) ; return ; case WM_VSCROLL : i = GetWindowLong ((HWND) lParam, GWL_ID) ; switch (LOWORD (wParam)) { case SB_PAGEDOWN : color[i] += 15 ; case SB_LINEDOWN : color[i] = (255, color[i] + 1) ; break; case SB_PAGEUP : color[i] -= 15 ; case SB_LINEUP : color[i] = max (0, color[i] - 1) ; break; case SB_TOP : color[i] = ; break ; case SB_BOTTOM : color[i] = 255 ; break ; case SB_THUMBPOSITION : case SB_THUMBTRACK : color[i] = HIWORD (wParam) ; break ; default : break ; } SetScrollPos (hwndScroll[i], SB_CTL, color[i], TRUE) ; wsprintf (szBuffer, TEXT ("%i"), color[i]) ; SetWindowText (hwndValue[i], szBuffer) ; DeleteObject ( (HBRUSH)SetClassLong( hwnd, GCL_HBRBACKGROUND, (LONG)CreateSolidBrush ( RGB( color[0], color[1], color[2] ) ) ) ) ; InvalidateRect (hwnd, &rcColor, TRUE) ; return ; case WM_CTLCOLORSCROLLBAR : i = GetWindowLong ((HWND) lParam, GWL_ID) ; return (LRESULT) hBrush[i] ; case WM_CTLCOLORSTATIC : i = GetWindowLong ((HWND) lParam, GWL_ID) ; if (i >= && i

Ngày đăng: 03/10/2013, 13:20

Hình ảnh liên quan

Hình 3.1 Minh họa các lớp Button - CHƯƠNG 3 CÁC ĐỐI TƯỢNG ĐIỀU KHIỂN

Hình 3.1.

Minh họa các lớp Button Xem tại trang 2 của tài liệu.
Bảng 3.1 Định danh mã thông báo Button - CHƯƠNG 3 CÁC ĐỐI TƯỢNG ĐIỀU KHIỂN

Bảng 3.1.

Định danh mã thông báo Button Xem tại trang 2 của tài liệu.
Bảng 3.3 Các giá trị của mã thông báo - CHƯƠNG 3 CÁC ĐỐI TƯỢNG ĐIỀU KHIỂN

Bảng 3.3.

Các giá trị của mã thông báo Xem tại trang 11 của tài liệu.
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 - CHƯƠNG 3 CÁC ĐỐI TƯỢNG ĐIỀU KHIỂN

au.

đâ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 Xem tại trang 11 của tài liệu.
Hình 3.3 Ứng dụng minh họa lớp ComboBox - CHƯƠNG 3 CÁC ĐỐI TƯỢNG ĐIỀU KHIỂN

Hình 3.3.

Ứng dụng minh họa lớp ComboBox Xem tại trang 14 của tài liệu.
Bảng 3.4 Các giá trị wParam của thông điệp thanh cuộn - CHƯƠNG 3 CÁC ĐỐI TƯỢNG ĐIỀU KHIỂN

Bảng 3.4.

Các giá trị wParam của thông điệp thanh cuộn Xem tại trang 16 của tài liệu.
Hình 3.4 Ứng dụng minh họa lớp ScrollBar - CHƯƠNG 3 CÁC ĐỐI TƯỢNG ĐIỀU KHIỂN

Hình 3.4.

Ứng dụng minh họa lớp ScrollBar Xem tại trang 18 của tài liệu.

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan