Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 35 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
35
Dung lượng
0,95 MB
Nội dung
NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS Trang 25 Chương 2 HỘPTHOẠIVÀTHANHTRÌNH ðƠN 2.1. MỞ ðẦU Hộpthoại (dialog) vàthanhtrình ñơn (menu) là các thành phần không thể thiếu trong việc tổ chức giao tiếp giữa người sử dụng và chương trình. Hộpthoại ñược xem như là một loại cửa sổ ñặc biệt, là công cụ mềm dẻo, linh hoạt ñể ñưa thông tin vào chương trình một cách dễ dàng. Trong khi menu là công cụ giúp người dùng thực hiện các thao tác ñơn giản hơn, thông qua các nhóm chức năng thường sử dụng. 2.2. HỘPTHOẠIHộpthoại phối hợp giữa người sử dụng với chương trình bằng một số phần tử ñiều khiển mà các phần tử này nhận nhiệm vụ thu nhận thông tin từ người dùng và cung cấp thông tin ñến người dùng khi người dùng tác ñộng ñến các phần tử ñiều khiển. Các phần tử ñiều khiển này nhận cửa sổ cha là một hộp thoại. Các phần tử ñiều khiển thường là các Button, List Box, Combo Box, Check Box, Radio Button, Edit Box, Scroll Bar, Static. Tương tự như các thông ñiệp gởi ñến thủ tục WndProc của cửa sổ chính.Windows sẽ gởi các thông ñiệp xử lý hộpthoại ñến thủ tục xử lý hộpthoại DlgProc. Hai thủ tục WndProc và thủ tục DlgProc tuy cách làm việc giống nhau nhưng giữa chúng có những ñiểm khác biệt cần lưu ý. Bên trong thủ tục xử lý hộpthoại bạn cần khởi tạo các phần tử ñiều khiển bên trong hộpthoại bằng thông ñiệp WM_INITDIALOG, cuối cùng là ñóng hộp thoại, còn thủ tục xử lý WndProc thì không có. Có ba loại hộpthoại cơ bản. Hộpthoại trạng thái (modal), hộpthoại không trạng thái (modeless) vàhộpthoại thông dụng (common dialog) mà chúng ta sẽ ñề cập cụ thể trong các phần dưới. 2.2.1. Hộpthoại trạng thái Hộpthoại trạng thái (modal) là loại hộpthoại thường dùng trong các ứng dụng của chúng ta. Khi hộpthoại trạng thái ñược hiển thị thì bạn không thể chuyển ñiều khiển ñến các cửa sổ khác, ñiều này có nghĩa bạn phải ñóng hộpthoại hiện hành trước khi muốn chuyển ñiều khiển ñến các cửa sổ khác. 2.2.1.1. Cách tạo hộpthoại ñơn giản Sau ñây là chương trình tạo ra một hộpthoại ñơn giản. Hộpthoại ñược tạo ra có nội dung như sau. Khi hộpthoại hiện lên có xuất hiện dòng chữ "HELLO WORLD", bên trên hộpthoại có một biểu tượng của hộpthoại ñó là một icon, và phía dưới hộpthoại là một nút bấm (Button) có tên là OK, khi nhấp chuột vào nút OK thì hộpthoại "HELLO WORLD" ñược ñóng lại. Tech24.vn NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS Trang 26 Hình 2.1 Hộpthoại ñơn giản ðoạn code chương trình như sau (Ví dụ 2.1): DIALOG.CPP (trích dẫn) LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); BOOL CALLBACK DialogProc (HWND, UINT, WPARAM, LPARAM) ; LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HINSTANCE hInstance ; switch (message) { case WM_CREATE : hInstance = ((LPCREATESTRUCT) lParam)->hInstance ; return 0 ; case WM_COMMAND : switch (LOWORD (wParam)) { case IDC_SHOW : DialogBox (hInstance, TEXT ("DIALOG1"), hwnd, DialogProc) ; break; Tech24.vn NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS Trang 27 } return 0 ; case WM_DESTROY : PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; } /*----------------------hàm xử lý thông ñiệp hộp thoại-------------------------------*/ BOOL CALLBACK DialogProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG : return TRUE ; case WM_COMMAND : switch (LOWORD (wParam)) { case IDOK : EndDialog (hDlg, 0) ; return TRUE ; } break ; } return FALSE ; } Tech24.vn NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS Trang 28 DIALOG1.RC (trích dẫn) /*---------------------------------------dialog--------------------------------------------*/ DIALOG1 DIALOG DISCARDABLE 40, 20, 164, 89 STYLE DS_MODALFRAME | WS_POPUP FONT 9, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,54,65,50,14 CTEXT "HELLO WORLD ",IDC_STATIC,53,38,72,10 ICON IDI_ICON1,IDC_STATIC,68,9,20,20 END /* -----------------------------------------Menu------------------------------------------*/ MENU1 MENU DISCARDABLE BEGIN POPUP "Dialog1" BEGIN MENUITEM "&Show", IDC_SHOW END END 2.2.1.2. Hộpthoạivà tạo mẫu template cho hộpthoại Trong ví dụ 2.1 ở trên, ta ñã tạo hộpthoại bằng cách dùng các câu lệnh chứa trong file tài nguyên DIALOG1.RC. Cách làm này giúp ta hiểu cấu trúc lệnh của Windows, tuy nhiên công cự Visual C++ Developer Studio, ta có thể thiết lập một hộpthoại trực quan hơn như sau : Chọn Insert từ thực ñơn Resource View ñể thêm một hộp thoại, màn hình ñược thể hiện như trong hình 2.2. Miscrosoft sẽ hiển thị hộpthoại trực quan cùng với thanh công cụ ñể bạn có thể thêm các thành phần ñiểu khiển vào hộp thoại. Chúng ta có thể ñiều chỉnh các thuộc tính của hộpthoại như tên hộp thoại, ID hộp thoại, ví trí hiển thị của hộpthoại trên cửa sổ chính, kích thước chữ và kiểu chữ thể hiện trên hộpthoại .vv bằng cách nhấn chuột phải trên hộpthoại thì cửa sổ Properties của hộpthoại ñược hiển thị (hình 2.3). Tech24.vn NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS Trang 29 Hình 2.2 Thêm một Dialog trong Resource View Hình 2.3 Hộpthoại Properties của Dialog Trong cửa sổ Properties này chọn tab Styles, bỏ mục chọn Title Bar và không cần tạo tiêu ñề cho cửa sổ. Sau ñó ñóng cửa sổ Properties của hộpthoại lại. Bây giờ bắt ñầu thiết kế diện mạo cho hộp thoại. Xóa nút Cancel vì không cần ñến nút này. ðể thêm một biểu tượng vào hộpthoại ta nhấn nút Picture lên thanh công cụ và kích chuột vào hộpthoại rồi kéo khung chữ nhật theo kích thước mong muốn. ðây là nơi mà biểu tượng ñược hiển thị. Nhấn chuột phải vào khung chữ nhật vừa tạo, chọn Properties từ trình ñơn xuất hiện và ñể nguyên ñịnh danh của biểu tượng là IDC_STATIC. ðịnh danh này sẽ ñược Windowns tự khai báo trong file Resource.h với giá trị -1. Giá trị -1 là giá trị của tất cả các ñịnh danh mà chương trình không cần tham chiếu ñến. Tiếp ñến là chọn ñối tượng Icon trong trong mục Type, rồi gõ ñịnh danh của Icon cần thêm vào trong mục Image. Nếu ñã tạo ra biểu tượng Icon trước thì chỉ việc chọn Icon từ danh sách các Icon trong mục Image. ðể thêm dòng chữ "HELLO WORLD" vào hộp thoại, chọn Static Text từ bảng công cụ và ñặt ñối tượng vào hộp thoại. Nhấn chuột phải ñể hiện thị Properties của Static Text, sau ñó vào mục caption ñánh dòng chữ "HELLO WORD" vào ñây. Dịch và chạy chương trình sau ñó xem file DIALOG1.RC dưới dạng text, nội dung hộpthoại ñược Windows phát sinh như sau : DIALOG1 DIALOG DISCARDABLE 40, 20, 164, 90 Tech24.vn NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS Trang 30 STYLE DS_MODALFRAME | WS_POPUP FONT 9, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,54,65,50,14 CTEXT "HELLO WORLD ",IDC_STATIC,53,38,72,10 ICON IDI_ICON1,IDC_STATIC,68,9,21,20 END Dòng ñầu tiên là tên của hộpthoại "DIALOG1" kế tiếp là từ khóa DIALOG, DISCARDABLE và tiếp sau ñó là 4 số nguyên. Hai số nguyên ñầu tiên chỉ vị trí dòng, cột của hộpthoại sẽ ñược hiển thị trên cửa sổ chính. Hai số nguyên tiếp theo xác ñịnh kích thước của hộpthoại theo thứ tự cột và dòng. Lưu ý : Các thông số ñịnh tọa ñộ và kích thước của hộpthoại không tính theo ñơn vị Pixel mà tính theo kích cở của Font chữ. Số ño của tọa ñộ x và chiều rộng dựa trên 1/4 ñơn vị rộng trung bình của Font chữ. Số ño của tọa ñộ y và chiều cao dựa trên 1/8 ñơn vị cao trung bình của Font chữ. Theo sau lệnh STYLE là các thuộc tính của hộpthoại mà bạn cần thêm vào. Thông thường hộpthoại modal sử dụng các hằng WS_POPUP và DS_MODALFRAME ngoài ra còn có các hằng WS_CAPTION, WS_MAXIMIZEBOX, WS_MINIMIZEBOX, WS_POPUP, WS_VSCROLL, WS_HSCROLL, WS_SYSMENU, Lệnh BEGIN và lệnh END có thể ñược thay bằng { và }. Trong ví dụ trên, hộpthoại sử dụng 3 kiểu ñiều khiển là DEFPUSHBUTTON (kiểu nút bấm mặc ñịnh), ICON (biểu tượng), và kiểu CTEXT (văn bản ñược canh giữa). Một kiểu ñiều khiển ñược khai báo tổng quát như sau. Control-type "text", id , xPos, yPos, xWidth, yHeight, iStyle. Control-type là các từ khóa khai báo kiểu ñiều khiển như DEFPUSHBUTTON, ICON, CTEXT, …. id là ñịnh danh của các ñiều khiển, thông thường một ñiều khiển có một ñịnh danh riêng ñược gởi cùng với thông ñiệp WM_COMMAND ñến các thủ tục xử lý thông ñiệp của cửa sổ cha. xPos, yPos là vị trí cột, dòng hiểm thị của ñiều khiển ñó trên cửa sổ cha. xWidth, yHeight là chiều rộng và chiều cao của ñiều khiển ñó. ðối số cuối cùng là iStyle, ñối số này tùy chọn dùng ñể ñịnh nghĩa thêm các kiểu cửa sổ mà ñiều khiển cần thể hiện chúng thường là các hằng WS_ ñược khai báo trong tập tin “.h" của Windows. 2.2.1.3. Thủ tục xử lý thông ñiệp của hộpthoại Thủ tục xử lý thông ñiệp của hộpthoại dùng ñể xử lý tất cả các thông ñiệp từ bộ quản lý hộpthoại của Windows gởi ñến hôp thoại. Thủ tục này ñược Windows gọi khi có sự tác ñộng lên các phần tử ñiểu khiển nằm trong hộp thoại. Tech24.vn NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS Trang 31 Xét thủ tục xử lý hộpthoại DialogProc trong ví dụ 2.1. Thủ tục này có 4 tham số như thủ tục WndProc, và thủ tục này ñược ñịnh nghĩa kiểu trả về là CALLBACK.Tuy hai thủ tục này tương tự giống nhau nhưng thực sự giữa chúng có một vài sự khác biệt ñáng chú ý. Thủ tục DialogProc trả về giá trị kiểu BOOL, trong khi thủ tục WindProc thì trả về giá trị LRESULT. Thủ tục DialogProc trả về giá trị TRUE (giá trị khác 0) nếu nó xử lý thông ñiệp và ngược lại nếu không xử lý các thông ñiệp thì thủ tục trả về giá thị là FALSE (trị 0). Còn thủ tục WindProc thì gọi hàm DefWindowProc với các thông ñiệp không cần xử lý. Thủ tục DialogProc không cần xử lý thông ñiệp WM_DESTROY, cũng không cần xử lý thông ñiệp WM_PAINT và cũng không nhận ñược thông ñiệp WM_CREATE mà là thông ñiệp WM_INITDIALOG dùng ñể khởi tạo hộp thoại. Ngoài xử lý thông ñiệp WM_INITDIALOG, thủ tục xử lý thông ñiệp hộpthoại chỉ xử lý một thông ñiệp duy nhất khác là WM_COMMAND. ðây cũng là thông ñiệp ñược gởi ñến cửa sổ cha khi ta kích hoạt (nút nhấn ñang nhận ñược focus) lên các thành phần ñiểu khiển. Chỉ danh ID của nút “OK" là IDOK sẽ ñược chứa trong word thấp của ñối số wParam. Khi nút này ñược nhấn, thủ tục DialogProc gọi hàm EndDialog ñể kết thúc xử lý và ñóng hộp thoại. Các thông ñiệp gửi ñến hộpthoại không ñi qua hàng ñợi mà nó ñược Windows gọi trực tiếp hàm DialogProc ñể truyền các thông ñiệp vào cho thủ tục xử lý hộp thoại.Vì vậy, không phải bận tâm về hiệu ứng của các phím tắt ñược quy ñịnh trong chương trình chính. 2.2.1.4. Gọi hiển thị hộpthoạivà các vấn ñề liên quan Trong thủ tục WndProc khi xử lý thông ñiệp WM_CREATE Windows lấy về ñịnh danh hInstance của chương trìnhvà lưu nó trong biến tĩnh hInstance như sau. hInstance = ((LPCREATESTRUCT) lParam)->hInstance; Dialog1 kiểm tra thông ñiệp WM_COMMAND xem word thấp của ñối số wParam có bằng giá trị IDC_SHOW (chỉ danh của thành phần Show trong thực ñơn). Nếu phải, tức ñã chọn mục Show trên trình ñơn của cửa sổ chính và yêu cầu hiển thị hộp thoại, lúc này chương trình gọi hiển thị hộpthoại bằng cách gọi hàm. DialogBox (hInstance, TEXT ("DIALOG1"), hwnd, DialogProc) ðối số ñầu tiên của hàm này phải là hInstance của chương trình gọi, ñối số thứ hai là tên của hộpthoại cần hiển thị, ñối số thứ 3 là cửa sổ cha mà hộpthoại thuộc về, cuối cùng là ñịa chỉ của thủ tục xử lý các thông ñiệp của hộp thoại. Chương trình không thể trả ñiều khiển về hàm WndProc cho ñến khi hộpthoại ñược ñóng lại. Giá trị trả về của hàm DialogBox là giá trị của ñối số thứ hai trong hàm EndDialog nằm bên trong thủ tục xử lý thông ñiệp hộp thoại. Tuy nhiên chúng ta cũng có thể gởi thông ñiệp ñến hàm WndProc yêu cầu xử lý ngay cả khi hộpthoại ñang mở nhờ hàm SendMessage như sau : SendMessage(GetParent(hDlg), message, wParam, lParam) Tech24.vn NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS Trang 32 Tuy Visual C++ Developer ñã cung cấp cho chúng ta bộ soạn thảo hộpthoại trực quan mà ta không cần phải quan tâm ñến nội dung trong tập tin .RC. Tuy nhiên với cách thiết kế một hộpthoại bằng các câu lệnh giúp chúng ta hiểu chi tiết hơn cấu trúc lệnh của Windows hơn thế nữa tập lệnh dùng ñể thiết kế hộpthoại phong phú và ña dạng hơn rất nhiều so với những gì mà ta trực quan ñược trên bộ soạn thảo của Developer. Bằng cách sử dụng các lệnh ñặc biệt trong tập tin Resource editor của Visual C++ ta có thể tạo ra nhiều ñối tượng mà trong bộ soạn thảo không có. Thêm hằng WS_THINKFRAME vào mục STYLE ñể co giản hộpthoại (tương ñương với trong boder ta chọn mục Resizing). ðể ñặt nội dung tiêu ñề cho hộpthoại ta chỉ việc thêm hằng WS_CAPTION trong STYLE. STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION CAPTION "Hello Dialog1" Có thể dùng cách khác ñể thêm tiêu ñề cho hộp thoại, bằng cách trong khi xử lý thông ñiệp WM_INITDIALOG thêm vào dòng lệnh: SetWindowText(hDlg,TEXT("Hello Dialog")); Khi hộpthoại có tiêu ñề rồi, có thể thêm các chức năng phóng to và thu nhỏ hộpthoại bằng hằng WS_MINIMIZEBOX, WS_MAXIMIZEBOX. Có thể thêm trình ñơn vào hộpthoại nếu muốn bằng ñoạn lệnh. DIALOG1 DIALOG DISCARDABLE 40, 20, 164, 90 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION CAPTION "Hello Dialog1" MENU MENU1 Trong ñó MENU1 là tên của trình ñơn ta ñã tạo. Trong Visual C++ Developer ta chỉ cần chọn tên thực ñơn trong mục Menu như hình sau. Tech24.vn NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS Trang 33 Hình 2.4 Chọn menu trong Dialog Propertier Từ cửa sổ Properties trên thể chọn mục "Font" ñể ñịnh Font chữ cho hộp thoại. Gọi hàm DialogBoxIndirect ñể tạo ra một hộpthoại mà không cần dùng resource script. Hộpthoại tạo ra bằng hàm này trong khi chương trình ñang thực hiện ñược gọi là hộpthoại tạo tự ñộng. Trong ví dụ 3-1 ta chỉ dùng 3 kiểu ñiều khiển ñó là các kiểu ‘ICON’, ‘CTEXT’, ‘DEFPUSHBUTTON’. Ngoài ra còn có các kiểu ñiều khiển ñược liệt kê trong bảng sau. Kiểu ñiều khiển Lớp cửa sổ Kiểu cửa sổ PUSHBUTTON Button BS_BUSHBUTTON DEFPUSHBUTTON Button BS_DEFBUSHBUTTON | WS_TABSTOP CHECKBOX Button BS_CHECKBOX | WS_TABSTOP RADIOBUTTON Button BS_RADIOBUTTON | WS_TABSTOP GROUPBOX Button BS_GROUPBOX | WS_TABSTOP LTEXT Static SS_LEFT | WS_GROUP CTEXT Static SS_CENTER | WS_GROUP RTEXT Static SS_RIGHT | WS_GROUP ICON Static SS_ICON EDITTEXT Edit ES_LEFT | WS_BORDER | WS_STABSTOP SCROLLBAR Scrollbar SBS_HORZ LISTBOX Listbox LBS_NOTIFY | WS_BORDER | WS_VSCROLL COMBOBOX Combobox CBS_SIMPLE | WS_TABSTOP Bảng 2.1 Các kiểu ñiều khiển Các kiểu ñiều khiển ñược khai báo trong resource script có dạng như sau, ngoại trừ kiểu ñiều khiển LISTBOX, COMBOBOX, SCROLLBAR, EDITTEXT. Control-type "text", id, xPos, yPos, xWidth, yHeight, iStyle Các kiểu ñiều khiển LISTBOX, COMBOBOX, SCROLLBAR, EDITTEXT ñược khai báo trong resource script với cấu trúc như trên nhưng không có trường "text". Tech24.vn NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS Trang 34 Thêm thuộc tính cho các kiểu ñiều khiển bằng cách thay ñổi tham số iStyle. Ví dụ ta muốn tạo radio button với chuỗi diễn ñạt nằm ở bên trái của nút thì ta gán trường iStyle bằng BS_LEFTTEXT cụ thể như sau. RADIOBUTTON Radio1",IDC_RADIO1,106,10,53,15,BS_LEFTTEXT Trong resource script ta cũng có thể tạo một kiểu ñiểu khiển bằng lệnh tổng quát sau. CONTROL "text", id, "class", iStyle, xPos, yPos, xWidth, yHeight Trong ñó class là tên lớp muốn tạo ví dụ thay vì tạo một radio button bằng câu lệnh. RADIOBUTTON "Radio1",IDC_RADIO1,106,10,53,15,BS_LEFTTEXT Thay bằng ñoạn lệnh sau: CONTROL"Radio1",IDC_RADIO1,"button",106,10,53,15,BS_LEFTTEXT 2.2.1.5. Ví dụ chương trình về hộp thoại. ðể minh họa cho việc trao ñổi thông ñiệp giữa các thành phần ñiều khiển bên trong hộpthoại (ñóng vai trò là một cửa sồ cha) với các thành phần ñiều khiển con nằm bên trong hộp thoại, và cơ chế quản lý hộpthoại của Windows. Chúng ta tiến hành xem xét ví dụ 2-2. Kết quả thực hiện của chương trình như trong hình 2.5. Cửa sổ hộpthoại gồm có ba nhóm nút chọn radio.Nhóm thứ nhất dùng ñể chọn ñối tượng vẽ là hình chữ nhật hay hình ellipse, nhóm thứ hai dùng ñể chọn màu tô cho hình vẽ, nhóm thứ 3 dùng ñể chọn kiểu tô cho hình vẽ. Khi thay ñổi việc chọn màu tô, kiểu tô thì màu tô và kiểu tô của hình vẽ cạnh bên sẽ thay ñổi theo màu tô, và kiểu tô vừa mới chọn. Khi nhấn nút OK thì hộpthoại ñóng lại và màu tô, kiểu tô cùng hình vẽ vừa mới vẽ sẽ ñược hiển thị lên cửa sổ chính. Nếu nhấn nút Cancel hoặc nhấn phím Esc thì hộpthoại ñược ñóng lại nhưng hình vẽ, màu tô và kiểu tô không ñược hiển thị lên cửa sổ chính. Trong ví dụ này nút OK và nút Cancel có chỉ danh ID lần lượt là IDOK và IDCANCEL.Thông thường ñặt chỉ danh cho các phần tử ñiều khiển nằm trong hộpthoại ñược bắt ñầu bằng chữ ID. Biểu tượng chiếc xe ñạp trên hộpthoại ñó là một icon. Trên thanh tiêu ñề của cửa sổ chính có một biểu tượng, biểu tượng ñó cũng là một icon (ñó là một ly trà). Khi ñặt các nút radio vào hộpthoại bằng công cụ Developer studio nhớ phải ñặt các nút ñó theo thứ tự như hình 2-5. Thì khi ñó Windows mới phát sinh mã cho các nút ñó theo thứ tự tăng dần, ñiều này giúp chúng ta dễ dàng kiểm soát các thao tác trên tập các nút radio. Bạn nhớ bỏ luôn mục chọn Auto trong phần thiết lập Properties của các nút chọn radio. Bởi vì các nút radio mang thuộc tính Auto yêu cầu viết ít mã lệnh hơn ngưng chúng thường khó hiểu so với các nút không có thuộc tính Auto. Chọn thuộc tính Group, Tab stop trong phần thiết kế Properties của nút OK, nút Cancel, và hai nút radio ñầu tiên trong ba nhóm radio ñể có thể chuyển focus (chọn) bằng phím Tab trên bàn phím. Tech24.vn [...]... không th thi u là menu c a chương trình Menu xu t hi n ngay dư i thanh tiêu ñ c a chương trình ng d ng Ngoài ra trong m t s ng d ng thanh menu có th di chuy n ñư c Te Th t ra menu cũng khá ñơn gi n, vì chúng ñư c t ch c thành các nhóm trên thanh chính (File, Edit, View,…), m i m c li t kê trong menu chính có th ch a m t hay nhi u m c li t kê g i là menu popup hay dropdown, và v i m i m c li t kê trong menu... TRÌNH L P TRÌNH C TRÊN WINDOWS break; Có nghĩa n u hàm DialogBox tr v giá tr TRUE, t c nút OK ñư c nh n Lúc ñó th t c WndProc s c p nh t l i n i dung c a c a s chính, b ng cách ghi l i s thay ñ i giá tr c a hai bi n toàn c c iCurrentColor và giá tr iCurrentFigure dùng ñ v l i hình ch nh t hay hình ellipse v i màu ñư c ch n là iCurrentColor Và ngư c l i n u nh n nút Cancel thì giá tr iCurrentColor và. .. tho i thì hàm IsDialogMessage ki m tra và g i ñ n các th t c x lý h p tho i Và lúc này hàm tr v giá tr TRUE, còn ngư c l i thì hàm tr v giá tr FALSE N u dùng thêm ch c năng phím tăng t c thì ño n chương trình trên ñư c vi t l i như sau while(GetMessage(&msg, NULL, 0, 0)) { if (hDlgModeless==0 || !IsDialogMessage(hDlgModeless, &msg); Trang 46 NGÔN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS { if(TranslateAccelerator... ch n lo i hình v trên radio button, lo i hình v ñư c ch n s v cùng lúc lên control tĩnh c a h p tho i và c a s chính Dùng chu t ñ ch n màu tô cho hình v ñư c ch n, b ng cách rê chu t lên 3 thanh cu n Scrollbar Chương trình minh h a (Ví d 2.3) : *MODELESS.CPP (trích d n) Trang 47 NGÔN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS void PaintWindow (HWND hwnd, int iColor[], int iFigure) { HBRUSH hBrush ; HDC hdc... ñ l y handle c a nút ñư c ch n và lưu vào bi n i Hàm SendMessage dùng ñ g i thông ñi p MB_SETCHECK t i các nút radio N u word th p c a ñ i s wParam b ng ch danh ID c a nút ñư c ch n thì nút ñó ñư c ñánh d u và các nút khác s không ñư c ch n Chú ý :Trong các ví d trên thư ng dùng hai nút OK và nút Cancel, hai nút này ñư c Windows ñ t ñ nh danh m c ñ nh theo th t là IDOK và IDCANCEL Thông thư ng ñóng... xám, khi ñó ngư i dùng s bi t r ng m c li t kê ñó không có hi u l c 2.3.1 Thi t l p Menu ð t o m t menu và ñưa vào chương trình bao g m các bư c sau: *T o menu trong t p tin tài nguyên *.RC: ð t o menu trong t p tin tài nguyên, thư ng có 2 cách chính là: dùng m t trình so n th o ñ m t p tin tài nguyên và so n th o theo c u trúc t p tin RC cung c p cho tài nguyên menu Thông thư ng, cách này ít s d ng,... o menu m t cách d dàng Trang 52 NGÔN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS *Cài ñ t menu vào c a s c a chương trình ng d ng: ph n này ñơn gi n là khi ñ nh nghĩa l p c a s ta thi t l p thu c tính lpszMenuName c a c u trúc l p WNDCLASS b ng tên menu ñư c khai báo trong t p tin tài nguyên Ví d : wndclass.lpszMenuName = "MENU1"; Ngoài ra, có th cài ñ t menu vào c a s b ng cách dùng l nh : hMenu = LoadMenu... g i hàm t o c a s CreateWindow, tham s th 9 ñư c thi t l p NULL, sau ñó trong chương trình dùng l nh: SetMenu(hWnd, hMenu); ñ thi t l p menu cho c a s Te ch 2 *Thêm các ño n chương trình x lý menu: Windows phát sinh thông ñi p WM_COMMAND và g i ñ n chương trình khi ngư i dùng ch n m t m c li t kê có hi u l c trên thanh menu Khi ñó ch c n x lý thông ñi p WM_COMMAND b ng cách ki m tra 16 bit th p c... t kê trên menu có 3 d ng: có hi u l c (enabled), không có hi u l c (disabled), và màu xám (grayed) V i quan ñi m l p trình thì ta ch c n hai tr ng thái là có hi u l c và không có hi u l c mà thôi, do ñó tr ng thái màu xám s ch cho ngư i dùng bi t là tr ng thái c a m c li t kê có hi u l c hay không Vì v y khi vi t chương trình nh ng m c nào không có hi u l c thì ta thi t l p tr ng thái màu xám, khi... thông ñi p WM_COMMAND v i thành ph n LOWORD c a ñ i s wParam có giá tr Trang 42 NGÔN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS IDCANCEL (ñ nh danh m c ñ nh c a nút Cancel) Do ñó không c n ph i x lý thêm các phím gõ ñ ñóng h p tho i Trong ví d 2.2 ñ x lý hai trư ng h p khi nh n nút Cancel và nút OK ta dùng ño n chương trình sau switch (LOWORD (wParam)) { case IDOK: iCurrentColor = iColor ; iCurrentFigure = . NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS Trang 25 Chương 2 HỘP THOẠI VÀ THANH TRÌNH ðƠN 2.1. MỞ ðẦU Hộp thoại (dialog) và thanh trình ñơn (menu). tính của hộp thoại như tên hộp thoại, ID hộp thoại, ví trí hiển thị của hộp thoại trên cửa sổ chính, kích thước chữ và kiểu chữ thể hiện trên hộp thoại. vv