Giá trị trả về của hàm:
IDABORT: Nút Abort được chọn
IDCANCEL: Nút Cancel được chọn
IDIGNORE: Nút Ignore được chọn
IDNO: Nút No được chọn
IDOK: Nút Ok được chọn
IDRETRY: Nút Retry được chọn
IDYES: Nút Yes được chọn
97 trang |
Chia sẻ: maiphuongdc | Lượt xem: 2460 | Lượt tải: 2
Bạn đang xem trước 20 trang tài liệu Bài giảng Lập trình C trên win, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
* Lập trình C trên Windows 1.3: LẬP TRÌNH TRÊN MICROSOFT WINDOWS Cơ chế thông điệp: * Lập trình C trên Windows 1.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS Các thành phần cơ bản tạo nên ứng dụng Chương trình nguồn: Bao gồm các tập tin *.C và *.H tương tự như các chương trình trong C chuẩn cho DOS. Tuy nhiên trong đó là các cấu trúc đặc thù cho Windows Tập tin *.H để định nghĩa các hằng số, khai báo biến, khai báo hàm,... * Lập trình C trên Windows 1.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS Tập khai báo tài nguyên : Tất cả các tài nguyên được mô tả tóm tắt trong tập tin có tên phụ là *.RC Tài nguyên cho một ứng thường bao gồm : Biểu tượng của ứng dụng (Icon) Con trỏ màn hình(cursor) Các hình ảnh (bitmap) Hộp hội thoại (Dialog) Khai báo control Menu cho ứng dụng * Lập trình C trên Windows 1.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS Tập tin khai báo các thuộc tính cho ứng dụng Các thuộc tính chẳng hạn như kích thước stack, kích thước heap,.... được khai báo trong tập tin .DEF. Nếu không có chương trình ứng dụng cài đặt giá trị mặc định. Tập tin đề án : Tên_Dự_án.DSW (*.DSW) * Lập trình C trên Windows 1.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS Hàm WinMain int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) hInstance chỉ danh của instance hiện hành hPrevInstance chỉ danh của instance vừa chạy lần trước. Nếu có thì tham số khác không , nếu tham số bằng 0 thì hInstance là instance đầu tiên của ứng dụng. lpszCmdLine : câu lệnh gọi từ chức năng Run trong thực đơn File của Program Manager, giống như đối số argc của hàm main() trong C chuẩn và có kiểu char far * (LPSTR). nCmdShow : Qui định cách thức thể hiện window của ứng dụng * Lập trình C trên Windows 1.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS Các thành phần của hàm WinMain Đăng ký lớp cửa sổ: WNDCLASS wndclass; // biến để định nghĩa một cửa sổ // Định nghĩa kiểu cửa sổ wndclass.style = SC_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; // Hàm thủ tục cửa sổ wndclass.cbClsExtra = 0;//Giá trị mở rộng của lớp wndclass.cbWndExtra = 0;// * Lập trình C trên Windows 1.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS // Định nghĩa kiểu cửa sổ (tt): wndclass.hInstance = hInstance; // Định danh ứng dụng wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclass.hCursor = LoadCusor (NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; // Không có menu wndclass.lpszClassName = szAppName; // tên ứng dụng * Lập trình C trên Windows 1.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS // Đăng ký lớp cửa sổ if (!RegisterClass(&wndclass)) return 0 * Lập trình C trên Windows 1.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS // Tạo lập cửa sổ hwnd = CreateWindow (szAppName, // Tên cửa sổ "Hello Program", // Tiêu đề WS_OVERLAPPEDWINDOW, // Kiểu cửa sổ CW_USEDEFAULT, // Tọa độ x CW_USEDEFAULT, // Tọa độ y CW_USEDEFAULT, // Chiều rộng CW_USEDEFAULT, // Chiều dài NULL, // Cửa sổ cha NULL, // Không có menu hInstacne, // Định danh ứng dụng NULL); // Tham số bổ sung * Lập trình C trên Windows 1.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS // Hiển thị cửa sổ ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); * Lập trình C trên Windows 1.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS // Chu trình xử lý các thông điệp while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } * Lập trình C trên Windows 1.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS Hàm window (window function) Một ứng dụng giao tiếp với người sử dụng qua một hay nhiều window, mỗi window trong ứng dụng được kết hợp với một window function. Nhiệm vụ của hàm window là xử lý các message do hệ điều hành Windows hay WinMain gởi tới. Một ứng dụng viết trên Windows không bao giờ gọi trực tiếp window function. LRESULT CALLBACK WndProc(HWND hWnd, UINT Message,WPARAM wParam, LPARAM lParam); * Lập trình C trên Windows 1.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS /*Xử lý các thông điệp cần thiết với ứng dụng*/ case WM_CREATE: /*Viết đoạn mã khi tạo cửa sổ*/ return 0; case WM_PAINT: /*Viết đoạn mã khi tô vẽ lại cửa sổ*/ return 0; case WM_SIZE: /*Viết đoạn mã khi kích thước cửa sổ thay đổi*/ return 0; case WM_DESTROY: /*Cửa sổ bị đóng*/ PostQuitMessage (0); return 0; * Lập trình C trên Windows 1.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS Thông điệp WM_DESTROY Thông điệp này chỉ định rằng Windows đang trong quá trình hủy một cửa sổ khi người sử dụng click vào nút close button hay chọn close trong thực đơn hệ thống. Thông điệp này được Windows gởi đến hàm window thông qua tham số Message của hàm window. Xử lý thông thường của thông điệp này là kết thúc chương trình bởi vì người sử dụng huỷ bỏ cửa sổ chính. Để kết thúc chương trình gọi hàm PostQuitMessage(0), hàm này gởi đi thông điệp WM_QUIT làm cho message loop kết thúc. * Lập trình C trên Windows 1.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS Thông điệp WM_CREATE Hàm window nhận được thông điệp này khi Windows đang xử lý hàm CreateWindow trong hàm WinMain, tức là lúc chương trình mới bắt đầu. Thông điệp này gởi đến hàm window qua thông số Message của hàm window. Thông điệp gởi đi khi chương trình mới bắt đầu do đó việc xử lý message là thường khởi động các giá trị ban đầu của chương trình ứng dụng. * Lập trình C trên Windows 1.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS Thông điệp WM_PAINT Thông điệp WM_PAINT được phát đi khi một phần hay tất cả vùng client (vùng làm việc của cửa sổ) bị không hợp lệ và cần cập nhật, vẽ lại. Một vùng client không hợp lệ khi cửa sổ đầu tiên được tạo ra, khi người sử dụng thay đổi kích thước cửa sổ, khi người sử dụng di chuyển các cửa sổ xung quanh màn hình để chúng xếp chồng lên nhau Windows không lưu các vùng cửa sổ chị che nên khi không bị che thì chúng bị bất hợp lệ. Thông điệp này được gởi qua thông số Message của hàm window và việc xử lý thông điệp này luôn bắt đầu bằng hàm BeginPaint, và kết thúc bằng EndPaint. * Lập trình C trên Windows 1.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS Xây dựng một ứng dụng đầu tiên WinMain : hàm chính của chương trình thực hiện các chức năng : Khai báo lớp cửa sổ. Đăng ký lớp cửa sổ vừa khai báo. Tạo và hiển thị lớp cửa sổ trên. Vòng lặp nhận thông điệp. WndProc : Hàm xử lý thông điệp gởi đến cửa sổ . * Lập trình C trên Windows 1.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS Các kiểu dữ liệu mới PSTR: một con trỏ đến một chuỗi tương tự như char* WPARAM và LPARAM, trong tham số thứ 3 của hàm WndProc được khai báo là kiểu WORD, với kích thước 16-bit , còn tham số thứ 4 có kiểu LONG là 32-bit LRESULT: Kiểu này đơn giản được định nghĩa như là kiểu LONG HANDLE: là một số nguyên 32-bit được sử dụng như một kiểu định danh * Lập trình C trên Windows 1.4: CÁCH VIẾT MỘT UD TRÊN MS WINDOWS * Lập trình C trên Windows Chương 2: HỘP THOẠI VÀ THANH TRÌNH ĐƠN Lập trình C trên Windows 2.1: MỞ ĐẦU Hộp thoại (dialog) và thanh trì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ộp thoạ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 . * Lập trình C trên Windows 2.1: MENU Menu popup hay dropdown Các trạng thái của Menu: Check Uncheck Enabled Disabled Grayed SEPARATOR * Lập trình C trên Windows 2.1: MENU Thiết lập Menu Tạo menu trong tập tin tài nguyên *.RC Cú pháp: [Định_danh_menu] MENU DISCARDABLE (từ khóa) BEGIN POPUP "&[Tên_Mục 1]" BEGIN MENUITEM "&[Tên_mục_con 1.1]", [Tên ID 1.1] MENUITEM "&[Tên_mục_con 1.2]", [Tên ID 1.2] ………………………. END POPUP "&[Tên_Mục 2]" BEGIN MENUITEM "&[Tên_mục_con 2.1]", [Tên ID 2.1] MENUITEM "&[Tên_mục_con 2.2]", [Tên ID 2.2] ………………………. MENUITEM SEPARATOR END ………………………....... END * Lập trình C trên Windows 2.1: MENU Cách đặt menu vào cửa sổ của chương trình ứng dụng: 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 = “Tên_Menu”; Để 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ê. * Lập trình C trên Windows HỘP THÔNG BÁO int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType); hWnd: Chỉ danh cửa sổ sở hữu hộp thông báo, có thể để NULL lpText: Chuỗi thông báo lpCaption: Tựa đề hộp thông báo uType: Kiểm bao gồm các nút điều khiển * Lập trình C trên Windows HỘP THÔNG BÁO uType có thể là các giá trị sau: MB_ABORTRETRYIGNORE: Hộp thông báo bao gồm các nút Abort, Retry, Ignore MB_OK: Hộp thông báo bao gồm các nút Ok MB_OKCANCEL: Hộp thông báo bao gồm các nút Cancel, Ok MB_RETRYCANCEL: Hộp thông báo bao gồm các nút Retry, Cancel MB_YESNO: Hộp thông báo bao gồm các nút Yes, No MB_YESNOCANCEL: Hộp thông báo bao gồm các nút Yes, No, Cancel * Lập trình C trên Windows HỘP THÔNG BÁO Giá trị trả về của hàm: IDABORT: Nút Abort được chọn IDCANCEL: Nút Cancel được chọn IDIGNORE: Nút Ignore được chọn IDNO: Nút No được chọn IDOK: Nút Ok được chọn IDRETRY: Nút Retry được chọn IDYES: Nút Yes được chọn * Lập trình C trên Windows VÍ DỤ: Xây dựng một ứng minh họa Menu và hộp thông báo: * Lập trình C trên Windows 2.1: HỘP THOẠI Các phần tử trên Hộp thoại: Button List Box Combo Box Check Box Radio Button Edit Box Scroll Bar Static. * Lập trình C trên Windows 2.1: HỘP THOẠI Các loại Hộp thoại: Có 3 loại hộp thoại cơ bản Hộp thoại trạng thái (modal) Hộp thoại không trạng thái (modeless) Hộp thoại thông dụng (common dialog). * Lập trình C trên Windows Hộp thoại trạng thái (modal) Cách tạo hộp thoại đơn giản Cách 1: Tạo hộp thoại trong tập tin tài nguyên *.RC [Định_danh] DIALOG DISCARDABLE X,Y ,W,H STYLE [Hằng hiển thị kiểu hộp thoại] FONT , “Font name" BEGIN LOẠI ĐIỀU KHIỂU ,[ID], X,Y ,W,H …………………………………………. END * Lập trình C trên Windows Hộp thoại trạng thái (modal) Ví dụ: Tạo ra hộp thoại sau * Lập trình C trên Windows Hộp thoại trạng thái (modal) Viết code như sau: DIALOG1 DIALOG DISCARDABLE 40, 20, 164, 90 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 * Lập trình C trên Windows Hộp thoại trạng thái (modal) Cách 2: Sử dụng công cụ Visual C++ Developer Studio * Lập trình C trên Windows Hộp thoại trạng thái (modal) Kích hoạt một hộp hội thoại: Int DialogBox(HINSTANCE hThisInst, LPCSTR lpszName, HWND hWnd, DLGPROC lpDFunc); hThisInst : là chỉ danh thể hiện hiện thời. lpszName: Tên hộp hội thoại được xác định trong tập tin tài nguyên. hWnd :Chỉ danh của cửa sổ cha chứaDialog. lpDFunc: Con trỏ trỏ đến hàm xử lý message cho hộp hội thoại. * Lập trình C trên Windows Hộp thoại trạng thái (modal) Thủ tục xử lý thông điệp của hộp thoại: BOOL CALLBACK DialogFunc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) DialogProc không cần xử lý thông điệp WM_DESTROY, WM_PAINT và WM_CREATE Thông điệp WM_INITDIALOG dùng để khởi tạo. Thông điệp WM_COMMAND: gởi đến cửa sổ cha khi ta kích hoạt (trong word thấp của đối số wParam) * Lập trình C trên Windows Hộp thoại trạng thái (modal) Tắt hộp hội thoại: Để tắt hộp hội thoại modal dùng hàm EndDialog() như sau: BOOL EndDialog (HWND hDlg, int Status); hWnd : là chỉ danh hộp hội thoạiStatus: Mã trạng thái do hàm DialogBox trả về . Giá trị này có thể bỏ qua. Hàm trả về giá trị nonzero nếu thành công ngược lại zero . * Lập trình C trên Windows Chương 3: CÁC ĐỐI TƯỢNG ĐIỀU KHIỂN Lập trình C trên Windows Các loại điều khiển Nút nhấn (Push button) Cách khai trong tập tin tài nguyên: PUSHBUTTON “Nhãn", IDC_RED, X,Y , W, HMessage WM_COMMAND và IDC_RED: được gởi vào tham số message và wParam cho hàm xử lý hộp hội thoại. * Lập trình C trên Windows Các loại điều khiển Nuùt CheckBox Bổ sung Checkbox vào tập tin tài nguyên: CHECKBOX “String” , CBID, X, Y, W, H String: là văn bản trình bày dọc theo CBID : là message cho CheckboxX, Y : Tọa độ CheckboxW, H : Chiều rộng, cao hộp chức văn bản * Lập trình C trên Windows Các loại điều khiển Hoạt động của checkbox LONG SendDlgItemMessage(HWND hWnd, int ID, UINT IDMsg, WPARAM wParam, LPARAM lParam); Message BM_SETCHECK: Được gởi đến checkbox để xác lập trạng thái chọn hay không chọn. Message BM_GETCHECK: Được gởi đến checkbox để lấy các thông tin chọn hay không chọn. Giá trị BST_CHECKED: Hộp kiểm được chọn. Giá trị BST_UNCHECKED: Hộp kiểm không được chọn. * Lập trình C trên Windows Các loại điều khiển Ví dụ: case CBID:If(SendDlgItemMessage(hWnd, CBID, BM_GETCHECK, 0,0)==BST_UNCHECKED) { SendDlgItemMessage(hWnd, CBID, BM_SETCHECK, BST_CHECKED,0); }else SendDlgItemMessage(hWnd, CBID, BM_SETCHECK, BST_UNCHECKED,0); break; * Lập trình C trên Windows Các loại điều khiển Điều khiển tĩnh LTEXT “string”, ID,X, Y, W, H //Chuỗi được canh trái RTEXT “string”, ID,X, Y, W, H // Chuỗi được canh phải CTEXT “string”, ID,X, Y, W, H // Chuỗi được canh giữa String: là chuỗi được hiển.ID: chỉ danh của điều khiểnX,Y: Tọa độ bắt đầu chuỗiW, H: Chiều rộng, cao của chuỗi * Lập trình C trên Windows Các loại điều khiển Ñieàu khieån Radio Gioáng nhö ñieàu khieån checkbox nhö löïa choïn coù loaïi tröø AUTORADIOBUTTON “String”, ID, X, Y, W, H Hàm SendDlgItemMessage() gôûi thoâng ñieäp BM_GET_CHECK Neáu wParam laø BST_CHECHED ,nuùt naøy seõ ñöôïc choïn, Neáu laø BST_UNCHECHED hoäp seõ ñöôïc xoùa * Lập trình C trên Windows Các loại điều khiển Hoäp nhaäp vaên baûn (EDITTEXT) Khai báo trong tập tin .RC EDITTEXT ID, X,Y, W,H Caùch laáy döõ lieäu töø hoäp nhaäp döõ lieäu UINT GetDlgItemText(HWND hWnd, int ID, LPSTR lpstr, int Max) hWnd: chæ danh hoäp hoäi thoaïi ID: chæ danh EditText lpstr: Con troû chuoåi vaên baûn Max: soá kyù töï toái ña caàn laáy * Lập trình C trên Windows Các loại điều khiển Caùch ñöa döõ lieäu leân hoäp nhaäp döõ lieäu UINT SetDlgItemText(HWND hWnd, int ID, LPSTR lpstr) hWnd: chæ danh hoäp hoäi thoaïi ID: chæ danh EditText lpstr: Con troû chuoåi vaên baûn * Lập trình C trên Windows Các loại điều khiển Hoäp danh saùch(LISTBOX) Khai báo trong tập tin .RC LISTBOX ID, X, Y, W, H, style Ñöa danh saùch muïc choïn vaøo listbox thoâng qua message WM_INIDIALOG cuûa hoäp hoäi thoaïi vì message naøy ñöôïc phaùt ñi khi hoäp hoäi thoaïi khôûi ñoäng. * Lập trình C trên Windows Các loại điều khiển Ñeå theâm moät muïc choïn vaøo listbox caàn gôûi message LB_ADDSTRING ñeán listbox baèng haøm SendDlgItemMessage() LONG SendDlgItemMessage(HWND hDlg, int ID, UINT IDMsg, WPARAM wParm, LPARAM lParam) hWnd: cöûa soå dialog ID: chæ danh listbox IDMsg : Message caàn gôûi WParam =0 LParam: chuoãi caàn gôûi ñeán * Lập trình C trên Windows Các loại điều khiển Ví dụ SendDlgItemMessage(hWnd, LBID, LB_ADDSTRING, 0, “Apple”); * Lập trình C trên Windows Các loại điều khiển Các thao tác LB_INSERTSTRING: chèn một chuỗi vào vị trí bất kỳ Cú pháp: SendDlgItemMessage(hwndList, LB_INSERTSTRING, iIndex, (LPARAM) szString); iIndex là vị trí muốn chèn chuỗi vào. Nếu giá trị này bằng -1 thì chuỗi được chèn vào đáy của list box. * Lập trình C trên Windows Các loại điều khiển LB_DELETESTRING: Xóa một chuỗi trong list box Cú pháp: SendDlgItemMessage(hwndList, LB_DELETESTRING, iIndex, 0); iIndex là vị trí muốn xóa chuỗi vào. LB_RESETCONTENT: Xóa hết các phần tử nằm trong list box * Lập trình C trên Windows Các loại điều khiển LB_GETCOUNT: đếm số mục trong List box Cú pháp: SendDlgItemMessage(hwndList, LB_GETCOUNT, 0, 0); LB_GETTEXT: Để chép chuỗi trên mục ListBox vào vùng đệp (chuỗi). Cú pháp: SendDlgItemMessage(hwndList, LB_GETTEXT, index, (LPARAM) chuoi); * Lập trình C trên Windows Chương 4: THOÂNG ÑIEÄP BAØN PHÍM, MOUSE, TIMER Lập trình C trên Windows Chương 4: THÔNG ĐIỆP BÀN PHÍM, MOUSE, TIMER Các thông điệp về bàn phím Thông điệp bàn phím mà chương trình ứng dụng nhận được do Windows chuyển đến phân biệt tình huống phím gõ hay ký tự gõ. Các phím Shift, phím chức năng(F1, F2,….), các phím mũi tên di chuyển, các phím insert, Delete,… phát sinh phím gõ mà không phát sinh thông điệp ký tự gõ. * Lập trình C trên Windows Chương 4: THÔNG ĐIỆP BÀN PHÍM, MOUSE, TIMER Thông điệp phím gõ Khi một phím được nhấn Windows đặt thông điệp WM_KEYDOWN hoặc WM_SYSKEYDOWN và đưa vào hàng đợi thông điệp của ứng dụng hay cửa sổ nhận được sự quan tâm Khi nhả phím Windows đặt thông điệp WM_KEYUP hoặc WM_SYSKEYUP sẽ được hệ điều hành phân phát tới hàng đợi đó * Lập trình C trên Windows Chương 4: THÔNG ĐIỆP BÀN PHÍM, MOUSE, TIMER Mã phím ảo Mã ảo của phím được chứa trong tham số wParam đối với các thông điệp WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN và WM_SYSKEYUP , cho biết giá trị của phím nhấn hay thả. Giá trị LOWORD(lParam)(16 bit thấp ) chứa số lần nhấn của phím, đối với các thông điệp WM_KEYUP, WM_SYSKEYUP thì số lần luôn bằng 1. * Lập trình C trên Windows Chương 4: THÔNG ĐIỆP BÀN PHÍM, MOUSE, TIMER Bảng Mã phím ảo * Lập trình C trên Windows Chương 4: THÔNG ĐIỆP BÀN PHÍM, MOUSE, TIMER * Lập trình C trên Windows Chương 4: THÔNG ĐIỆP BÀN PHÍM, MOUSE, TIMER Trạng thái lật phím Trong chương trình đôi khi phải phải biết trạng thái của các phím Shift, Ctrl, Alt có được nhấn kèm không, hoặc Caps lock, Num Lock, Scroll Lock đang bật hay tắt. Các thông tin này có thể biết được bằng cách gọi hàm: IState = GetKeyState (VK_SHIFT); Istate magng giá trị âm nếu phím Shift đang nhấn kèm * Lập trình C trên Windows Chương 4: THÔNG ĐIỆP BÀN PHÍM, MOUSE, TIMER Thông điệp nhận dạng ký tự gõ Hàm TranslateMessage() diễn dịch các thông điệp phím gõ thành các thông điệp ký tự gõ. Hàm TranslateMessage sẽ tạo thông điệp ký tự gõ WM_CHAR và đặt nó vào hàng đợi và nó sẽ được xử lý lần kế tiếp. Các tham số lParam của thông điệp WM_CHAR tương tự tham số lParam của thông điệp phím gõ, còn tham số wParam của thông điệp ký tự gõ sẽ chứa mã ASCII thay vì mã phím ảo. * Lập trình C trên Windows Chương 4: THÔNG ĐIỆP BÀN PHÍM, MOUSE, TIMER Device context: Device context là một cấu trúc dữ liệu được duy trì để kết hợp với một thiết bị hiển thị như màn hình, máy in,… Khi vẽ đầu tiên phải lấy chỉ danh của device context và sau khi sử dụng chỉ danh device context phải giải phóng device context. HDC hDC; // Khai báo chỉ danh device context hDC = GetDC(hWnd); // Lấy chỉ danh DC của cửa sổ ReleaseDC(hWnd, hDC); // Giải phóng DC * Lập trình C trên Windows Chương 4: THÔNG ĐIỆP BÀN PHÍM, MOUSE, TIMER Hàm TextOut: Xuất chuỗi vào vùng client của cửa sổ TextOut(hDC, x, y, psText, iLength); Trong đó: hDC là device context của cửa sổ cần xuất. x, y điểm bắt đầu của chuỗi ký tự trong client psText là một con trỏ trỏ đốn một chuỗi ký tự. iLength là số ký tự trong chỗi cần xuất. * Lập trình C trên Windows Chương 4: THÔNG ĐIỆP BÀN PHÍM, MOUSE, TIMER Hàm LineTo(): Vẽ đường thẳng BOOL LineTo(HDC hDC, int X, int Y); Vẽ đường thẳng từ vị trí hiện hành đến tọa độ X, Y Hàm MoveToEx(): Thiết đặt vị trí hiện hành BOOL MoveToEx(HDC hDC, int X, int Y, LPPOINT lpCoord); Tọa độ hiện hành được xác định bởi X, Y Vị trí trước đó được trả về cấu trúc POINT được xác định trong lpCoord. * Lập trình C trên Windows Chương 4: THÔNG ĐIỆP BÀN PHÍM, MOUSE, TIMER Các thông điệp về mouse Để xác nhận sự hiện diện của mouse gọi hàm GetSystemMetrics: FMouse =GetSystemMetrics(SM_MOUSERESENT); Nếu fMouse là TRUE thì mouse được cài đặt, và là FALSE thì mouse không được cài đặt. * Lập trình C trên Windows Chương 4: THÔNG ĐIỆP BÀN PHÍM, MOUSE, TIMER Các thông điệp MOUSE trong vùng client Khi mouse di chuyển trên màn hình luôn phát ra thông điệp WM_MOUSEMOVE và khi các nút mouse được nhấn hay thả trong vùng client của một cửa sổ hàm window nhận các thông điệp: * Lập trình C trên Windows Chương 4: THÔNG ĐIỆP BÀN PHÍM, MOUSE, TIMER Đối với tất cả thông điệp giá trị lParam chứa vị trí của mouse. Word thấp LOWORD(lParam) là tọa độ x, word cao HIWORD(lParam) là tọa độ y so với góc trên bên trái của cửa sổ. Giá trị wParam chỉ định trạng thái của các nút chuột và các phím Shift và ctrl: MK_LBUTTON: Nút trái được nhấn MK_MBUTTON: Nút giữa được nhấn MK_RBUTTON: Nút phải được nhấn MK_SHIFT: Phím Shift được nhấn. MK_CONTROL: Phím Ctrl được nhấn. * Lập trình C trên Windows Chương 4: THÔNG ĐIỆP BÀN PHÍM, MOUSE, TIMER Các thông điệp về timer: Timer của hệ điều hành Windows là một dịch vụ định kỳ thông báo cho các ứng dụng biết rằng có một khoảng thời gian đã trôi qua. Thực hiện bằng cách sau một chu kỳ thời gian Windows gởi đến hàm window thông điệp WM_TIMER. * Lập trình C trên Windows Chương 4: THÔNG ĐIỆP BÀN PHÍM, MOUSE, TIMER Thiết lập bộ định thời: sử dụng hàm SetTimer. UINT SetTimer(HWND hWnd, UINT nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc); hWnd : Cửa sổ nhận thông điệp WM_TIMER nIDEvent : Chỉ danh của bộ Timer uElapse: Chu kỳ thời gian mà Windows gởi thông điệp WM_TIMER tới hàm windows ( tính bằng mili giây) lpTimerFunc: Địa chỉ hàm timer – Có thể là NULL * Lập trình C trên Windows Chương 4: THÔNG ĐIỆP BÀN PHÍM, MOUSE, TIMER Hàm KillTimer: để huỷ bỏ bộ định thời.. BOOL KillTimer( HWND hWnd, // handle of window that installed timer UINT uIDEvent // timer identifier ); * Lập trình C trên Windows Chương 5: XỬ LÝ VĂN BẢN VÀ FONT CHỮ Lập trình C trên Windows Chương 5: XỬ LÝ VĂN BẢN VÀ FONT CHỮ Device context: Device context là một cấu trúc dữ liệu được duy trì để kết hợp với một thiết bị hiển thị như màn hình, máy in,… Khi vẽ đầu tiên phải lấy chỉ danh của device context và sau khi sử dụng chỉ danh device context phải giải phóng device context. HDC hDC; // Khai báo chỉ danh device context hDC = GetDC(hWnd); // Lấy chỉ danh DC của cửa sổ ReleaseDC(hWnd, hDC); // Giải phóng DC * Lập trình C trên Windows Chương 5: XỬ LÝ VĂN BẢN VÀ FONT CHỮ Hàm DrawText: xuất văn bản. Cú pháp: int DrawText(HDC hDC, LPCTSTR lpString, int nCount, LPRECT lpRect, UINT uFormat); Trong đó: hDC // handle to device context lpString // con trỏ trỏ đến chuỗi cần vẽ nCount // chiều dài của chuỗi lpRect // con trỏ trỏ đến cấu trúc RECT uFormat // text-drawing flags * Lập trình C trên Windows Chương 5: XỬ LÝ VĂN BẢN VÀ FONT CHỮ Giá trị uFormat: DT_SINGLELINE: một dòng độc lập DT_CENTER : canh giữa ngang hình chữ nhật DT_VCENTER: canh giữa dọc hình chữ nhật * Lập trình C trên Windows Chương 5: XỬ LÝ VĂN BẢN VÀ FONT CHỮ Thiết lập màu chữ và màu nền. Cú pháp: COLORREF SetTextColor (HDC hDC , COLORREF color); COLORREF SetBkColor (HDC hDC , COLORREF color); Trong đó: color: macro RGB(int Red, int Green, int Blue). * Lập trình C trên Windows Chương 5: XỬ LÝ VĂN BẢN VÀ FONT CHỮ Font: có các thuộc tính Typeface: loạI font (Times, Courier, Arial,…) Style: kiểu dáng (normal, thin, bold,…) Size: kích cỡ chữ, được xác định theo đơn vị point, 1 point = 1/72 inch = 0.013837 inch * Lập trình C trên Windows Chương 5: XỬ LÝ VĂN BẢN VÀ FONT CHỮ Thiết lập font chữ cho vùng client. Để sử dụng font hệ thống của Windows thực hiện các bước như sau:: 1. Gọi hàm GetStockObject() để lấy điều khiển Font. HFONT hFont; //khai báo chỉ danh đk font hFont = GetStockObject(int fnObject); Trong đó: fnObject kiểu Font. Chọn SYSTEM_FONT là những loại font có trong hệ thống Windows * Lập trình C trên Windows Chương 5: XỬ LÝ VĂN BẢN VÀ FONT CHỮ 2. Gọi hàm GetObject () lấy các thông tin về Font. int GetObject( HFONT hFont, int LogFontSize, LOGFONT Lf ); Trong đó: hFoont: chỉ danh của điều khiển Font LogFontSize: Kích thước cấu trúc font LOGFONT Lf: Con trỏ trỏ đến cấu trúc LOGFONT Ví dụ: GetObject(hFont, sizeof(LOGFONT), (LOGFONT *) &Lf); * Lập trình C trên Windows Chương 5: XỬ LÝ VĂN BẢN VÀ FONT CHỮ Cấu trúc LOGFONT: typedef struct tagLOGFONT{ LONG lfHeight; LONG lfWidth; LONG lfEscapement; LONG lfOrientation; LONG lfWeight; BYTE lfItalic; BYTE lfUnderline; BYTE lfStrikeOut; BYTE lfCharSet; BYTE lfOutPrecision; BYTE lfClipPrecision; BYTE lfQuality; BYTE lfPitchAndFamily; TCHAR lfFaceName [LF_FACESIZE]; } LOGFONT; * Lập trình C trên Windows Chương 5: XỬ LÝ VĂN BẢN VÀ FONT CHỮ 3. Xác định Font tiếng việt trong trường lfFaceName của tham số lf strcpy((char*)lf.lfFaceName, "VNI-Times"); 4. Gọi hàm CreateFontIndirect() để tạo ra font có thuộc tính như đã xác định HFONT = CreateFontIndirect(CONST LOGFONT *lplf ); 5. Gọi hàm SelectObject() cài đặt Font đã xác định vào vùng client. HFONT = SelectObject(HDC hDC, HFONT hFont); * Lập trình C trên Windows Chương 6: ĐỒ HỌA VÀ CÁC ĐỐI TƯỢNG GDI Lập trình C trên Windows Chương 6: ĐỒ HỌA VÀ CÁC ĐỐI TƯỢNG GDI Thông điệp WM_PAINT: Được phát đi khi một phần hay tất cả vùng client bị không hợp lệ và cần cập nhật, vẽ lại. Vùng client không hợp lệ khi: - Cửa sổ đầu tiên được tạo ra. - Người sử dụng thay đổi kích thước cửa sổ. - Người sử dụng di chuyển các cửa sổ. * Lập trình C trên Windows Chương 6: ĐỒ HỌA VÀ CÁC ĐỐI TƯỢNG GDI Vẽ hình chữ nhật: Rectangle( HDC hDC, int upX, int upY, int lowX, int lowY) upX, upY: góc trên bên trái lowX, lowY: góc dưới bên phải * Lập trình C trên Windows Chương 6: ĐỒ HỌA VÀ CÁC ĐỐI TƯỢNG GDI Vẽ Elip: Ellipse( HDC hDC, int upX, int upY, int lowX, int lowY) upX, upY: góc trên bên trái lowX, lowY: góc dưới bên phải * Lập trình C trên Windows Chương 6: ĐỒ HỌA VÀ CÁC ĐỐI TƯỢNG GDI Tạ
Các file đính kèm theo tài liệu này:
- bai_giang_vc_105t.ppt