intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài giảng Lập trình Windows - Phạm Ngọc Hưng

Chia sẻ: Codon_03 Codon_03 | Ngày: | Loại File: PDF | Số trang:84

105
lượt xem
7
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Cùng tìm hiểu tổng quan lập trình Windows; lập trình Windows VC++/MFC; một số chủ đề nâng cao; xây dựng ứng dụng Windows Form được trình bày cụ thể trong "Bài giảng Lập trình Windows" do Phạm Ngọc Hưng biên soạn.

Chủ đề:
Lưu

Nội dung Text: Bài giảng Lập trình Windows - Phạm Ngọc Hưng

  1. TRƯỜNG ĐẠI HỌC B\CH KHOA H[ NỘI Lập trình Windows VIỆN CÔNG NGHỆ THÔNG TIN V[ TRUYỀN THÔNG • Mã số: IT4781 • Thời lượng: 2 (2-1-0-4) – Lý thuyết: 30 tiết LẬP TRÌNH WINDOWS – Bài tập: 15 tiết • Học phần tiên quyết: – Ngôn ngữ lập trình C, C++ Phạm Ngọc Hưng Bộ môn Kỹ thuật Máy tính hungpn@soict.hut.edu.vn Lập trình Windows 2 Nội dung Tài liệu tham khảo • Chương 1. Tổng quan lập trình Windows (4LT + • 1. Ivor Horton’s, Beginning Visual C++ 2010 1BT) • 2. Programming Windows with MFC 2nd • Chương 2. Lập trình Windows VC++/MFC (15LT + 6BT) • 2. VC++ and MFC Programming 2nd • Chương 3. Một số chủ đề nâng cao • 3. Sams teach yourself VC++ 6 in 21 days – Tạo thư viện liên kết động (DLL) (3LT + 2BT) • 4. MSDN – Luồng (Thread) (3LT + 2BT) • 5. http://www.functionx.com/visualc/ – Windows Socket (2LT + 2BT) • Chương 4. X}y dựng ứng dụng Windows Form (3LT + 2BT) • Bài tập lớn Lập trình Windows 3 Lập trình Windows 4 1
  2. Chương 1. Tổng quan lập trình Windows 1.1. Cơ bản về lập trình Windows • 1.1. Cơ bản về lập trình Windows (1T) • Windows: đồ họa trực quan, tài nguyên đa • 1.2. Cấu trúc của chương trình Windows (2T) dạng. • 1.3. Microsoft Foundation Classes (MFC) • Ứng dụng thân thiện với người sử dụng • 1.4. Lập trình Windows với VC++ 2008 thông qua giao diện đồ họa Windows. (1LT + 1BT) • Các ứng dụng có giao diện tương tác giống nhau: – Windows, title bar, toolbar, menu bar, status bar – Thanh thực đơn: File, Edit, Tool, Help… – Hộp thoại: thường chứa các điều khiển chung: Edit Control, Button Control, Checkbox…. Lập trình Windows 5 Lập trình Windows 6 Các thành phần của một cửa sổ Cơ chế lập trình Event-driven Lập trình Windows 7 Lập trình Windows 8 2
  3. Thông điệp (Windows Messages) Windows Message (cont.) • Hệ thống (Windows) ghi lại mỗi sự kiện xảy ra • HĐH Windows đảm nhiệm việc truyền tất cả các (event) trong một thông điệp (message) và đặt thông điệp của ứng dụng vào các cửa sổ khác nhau trong hàng đợi thông điệp (messages queue) của ứng dụng đó. • Thông điệp phát sinh: • Một chương trình Windows phải chứa một hàm – Từ hệ thống (Windows OS) đặc biệt để xử lý các thông điệp gọi là hàm xử lý – Từ ứng dụng cửa sổ WinProc (hoặc WindowProc): • Ví dụ: click/drag chuột, ấn phím, – Được gọi khi có bất kỳ thông điệp được truyền minimize/maximize/close cửa sổ, thay đổi kích đến cửa sổ (thông qua con trỏ hàm) thước cửa sổ, … – Xử lý các thông điệp đó và trả điều khiển về cho hệ thống. • Nhiều thông điệp trả lại cho Windows xử lý, gọi hàm DefWindowProc( ) Lập trình Windows 9 10 Lập trình Windows Windows Message (cont.) Windows API • Application Programming Interface: Giao diện lập trình ứng dụng • Cung cấp các hàm truy cập tài nguyên trong hệ thống (Windows) chứa trong các thư viện liên kết động DLL. • Các ứng dụng có thể truy cập đến các hàm API • Các hàm GDI (Graphics Device Interface) cho phép ứng dụng làm việc với nhiều kiểu thiết bị đồ họa. Lập trình Windows 11 Lập trình Windows 12 3
  4. Windows Data Types (1) Windows Data Types (2) Kiểu Ý nghĩa • Định nghĩa nhờ từ khóa typedef trong các tập tin (windef.h; HANDLE Số nguyên 32-bit, định danh. winbase.h, winuser.h được include trong windows.h). HWND Số nguyên 32-bit, định danh. • Ví dụ: BYTE Giá trị 8-bit không dấu. WORD Số nguyên 16-bit không dấu. – typedef int INT; DWORD Số nguyên 32-bit không dấu. – typedef unsigned int UINT; UINT Số nguyên không dấu 32-bit. LONG long 32-bit. – char * PSTR BOOL Kiểu logic True/False • WPARAM (UINT) và LPARAM (LONG) đều 32 bit LPSTR Con trỏ chuỗi. (char *) LPCSTR Hằng con trỏ chuỗi. • LRESULT: kiểu LONG WPARAM 32-bit. • HANDLE: Một gi| trị 32bits không dấu (unsigned) do HĐH LPARAM 32-bit. tạo ra để l{m định danh cho 1 đối tượng (file, cửa sổ, vùng BSTR Giá trị 32-bit trỏ đến kí tự. nhớ, menu, toolbar…). Ví dụ : HWND, HINSTANCE, LPVOID Con trỏ 32-bit đến một kiểu không xác định. LPTSTR Giống như LPSTR nhưng có thể chuyển sang dạng Unicode và hPrevInstance DBCS. LPCTSTR Giống như LPCTSTR nhưng có thể chuyển sang dạng Unicode và DBCS. Lập trình Windows 13 Lập trình Windows 14 Microsoft style (1) Microsoft Style (2) • Tất cả c|c kiểu dữ liệu mở rộng của windows , tên class, tên • Qui ước: bắt đầu (tiền tố) chữ thường thể struct, tên hằng số định sẵn đều được viết in hoa Ví dụ : hiện kiểu dữ liệu biến. Tên kiểu dữ liệu : UINT , ATOM , HANDLE, HWND, BYTE,…. • Ví dụ: szCmdLine là một biến lưu chuỗi nhập Tên cấu trúc : MSG, PAINSTRUCT, WNDCLASS ,.... Tên hằng số định sẵn : NULL, IDI_APPLICATION, từ dòng lệnh, sz là thể hiện cho biến kiểu CS_VREDRAW,….. chuỗi kết thúc ký tự 0, • Tất cả c|c method (c|c h{m, c|c phương thức) đều được viết • hInstance và hPrevInstance, trong đó h viết hoa (pascal notation). Ví dụ : tắt cho kiểu handle. LoadIcon(…) LoadCursor(…) SomeOtherName(…) Lập trình Windows 15 Lập trình Windows 16 4
  5. Microsoft Style (3) – Tiền tố tên biến Microsoft style (4) - Calling convention Tiền tố Kiểu dữ liệu c char, WCHAR, TCHAR • Định nghĩa kiểu h{m gọi bởi Windows OS by BYTE #define CALLBACK __stdcall n short #define WINAPI __stdcall i int x,y biến lưu tọa độ x, y #define APIENTRY WINAPI b BOOL #define APIPRIVATE __stdcall w WORD #define PASCAL __stdcall l long dw DWORD • Thêm vào trước tên hàm để chỉ ra cho s string compiler rằng hàm này có cách tổ chức phục sz chuỗi kết thúc bởi kí tự 0 h handle vụ cho việc gọi đến như thế nào. p pointer Lpsz con trỏ dài chuỗi ký tự kết thúc kí tự 0 Lập trình Windows 17 Lập trình Windows 18 1.2. Cấu trúc của chương trình Windows 1.2. Cấu trúc của chương trình Windows • Chương trình Windows đơn giản (dùng hàm API) gồm 2 hàm WinMain() và hàm xử lý cửa sổ WinProc(). • WinMain() thực hiện các chức năng: – Tell Windows what kind of window the program requires – Create the program window – Initialize the program window – Retrieve Windows messages intended for the program • WinProc(): xử lý các thông điệp liên quan đến cửa sổ của nó. Lập trình Windows 19 Lập trình Windows 20 5
  6. 1.2.1. Hàm WinMain() Hàm WinMain (cont.) • Hàm chính của ứng dụng trên Windows • Tìm hiểu hàm WinMain mẫu: • Program entry point int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) int WINAPI WinMain(HINSTANCE hInstance, { HINSTANCE hPrevInstance, static TCHAR szAppName[] = TEXT("HelloWin"); // tên ứng dụng PSTR szCmdLine, int iCmdShow) HWND hwnd; MSG msg; • hInstance, is a handle to the instance of the program you WNDCLASS wndclass; // biến để định danh một cửa sổ are writing. /* Ðịnh nghĩa kiểu cửa sổ */ wndclass.style = SC_HREDRAW | CS_VREDRAW; • hPrevInstance, is used if your program had any previous wndclass.lpfnWndProc = WndProc; // Hàm thủ tục cửa sổ instance. If not, this argument can be ignored. wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; • szCmdLine, is a string that represents all items used on the wndclass.hInstance = hInstance; // Ðịnh danh ứng dụng command line to compile the application. wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclass.hCursor = LoadCusor (NULL, IDC_ARROW); • nCmdShow, controls how the window you are building will wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); be displayed. Lập trình Windows wndclass.lpszMenuName = NULL; // Không có menu 21 22 Tìm hiểu hàm WinMain mẫu (cont.) Định nghĩa lớp cửa sổ WNDCLASS wndclass.lpszClassName = szAppName; // tên ứng dụng /* Ðăng ký lớp cửa sổ */ if (!RegisterClass(&wndclass)) return 0; • Windows cung cấp một cấu trúc WNDCLASS (file /* Tạo thể hiện lớp cửa sổ đã định nghĩa */ winuser.h) gọi là lớp cửa sổ. hwnd = CreateWindow(szAppName, // Tên cửa sổ "Hello Program", // Tiêu đề WS_OVERLAPPEDWINDOW, // Kiểu cửa sổ • Lớp này chứa các thuộc tính tạo thành một cửa sổ CW_USEDEFAULT, // Toạ độ x CW_USEDEFAULT, // Toạ độ y typedef struct _WNDCLASS CW_USEDEFAULT, // Chiều rộng { CW_USEDEFAULT, // Chiều dài UINT style; NULL, // Cửa sổ cha WNDPROC lpfnWndProc; NULL, // Không có menu hInstance, // Ðịnh danh ứng dụng int cbClsExtra; NULL); // Tham số bổ sung HINSTANCE hInstance; /* Hiển thị cửa sổ */ HICON hIcon; ShowWindow (hwnd, iCmdShow); HCURSOR hCursor; UpdateWindow (hwnd); HBRUSH hbrBackground; /* Chu trình xử lý các thông điệp*/ LPCSTR lpszMenuName; while (GetMessage (&msg, NULL, 0, 0)) { LPCSTR lpszClassName; TranslateMessage (&msg); } WNDCLASS, *PWNDCLASS; DispatchMessage (&msg); } return msg.wParam; 23 Lập trình Windows 24 } Lập trình Windows 6
  7. Định nghĩa lớp cửa sổ WNDCLASS Đăng ký lớp cửa sổ • Ý nghĩa thuộc tính lớp cửa sổ WNDCLASS: • Sau khi định nghĩa lớp cửa sổ phải đăng ký Thuộc tính Ý nghĩa Ghi chú Kiểu lớp Kết hợp nhiều kiểu giá bằng hàm RegisterClass: style trị khác nhau bằng toán tử OR. lpfnWndProc Con trỏ đến thủ tục xử lý cửa sổ Số byte được cấp phát thêm sau ATOM RegisterClass(CONST WNDCLASS * lpWndClass); cbClsExtra Mặc định cấu trúc window-class Số byte được cấp phát thêm sau cbWndExtra Mặc định một instance của window Định danh chứa thủ tục cửa sổ hInstance của lớp window hIcon Định danh của biểu tượng Dùng hàm LoadIcon hCursor Định danh của con trỏ chuột Dùng hàm LoadCursor Dùng hàm hbrBackground Định danh của chổi tô nền GetStockObject Tên thực đơn gắn với cửa sổ, thực đơn này lpszMenuName Tên thực đơn được khai báo trong tập tin tài nguyên. lpszClassName Tên lớp 25 Lập trình Windows 26 Tạo cửa sổ Hiển thị cửa sổ • Lớp cửa sổ thể hiện đặc tính chung cửa sổ. Cho • Sau khi tạo cửa sổ định danh cửa sổ HWND phép tạo nhiều thể hiện cửa sổ của lớp • Để xuất hiện cửa sổ gọi hàm ShowWindow • Dùng hàm CreateWindow, chỉ định các đặc tính riêng của cửa sổ, và phân biệt nó với các cửa sổ BOOL ShowWindow(HWND hWnd, // Ðịnh danh của cửa sổ cần thể hiện int iCmdShow // Trạng thái hiển thị khác tạo ra cùng một lớp. ); HWND CreateWindow(LPCSTR lpClassName, // Tên lớp cửa sổ đã đăng ký LPCSTR lpwindowName, // Tên của cửa sổ • Một số trạng thái hiển thị (iCmdShow): DWORD dwStyle, // Kiểu của cửa sổ int x, // Vị trí ngang ban đầu int y, // Vị trí dọc ban đầu SW_HIDE: Ẩn cửa sổ. int nWidth, // Ðộ rộng ban đầu SW_MAXIMIZE: Phóng cửa sổ ra toàn bộ màn hình. int nHeight, // Ðộ cao ban đầu SW_MINIMIZE: Thu nhỏ thành biểu tượng trên màn hình. HWND hWndParent, // Ðịnh danh của cửa sổ cha MENU hMenu, // Ðịnh dang của thực đơn SW_RESTORE: Hiển thị dưới dạng chuẩn. INSTANCE hInstance, // Ðịnh danh thể hiện ứng dụng PVOID lpParam // Các tham số ban đầu ); Lập trình Windows 27 Lập trình Windows 28 7
  8. 1.2.2. Hàm xử lý thông điệp WinProc Message Loop • Có thể có nhiều hơn một hàm xử lý thông điệp • Windows duy trì một hàng đợi thông điệp cho mỗi • Luôn đi kèm cửa sổ của nó chương trình • Giao tiếp với hệ thống (Windows), toàn bộ các • Khi sự kiện nhập thông tin xuất hiện, Windows thông điệp gửi tới được xử lý qua hàm này dịch sự kiện thành dạng thông điệp và đưa vào • Thường khai báo như sau: hàng đợi thông điệp của ứng dụng tương ứng. • Ứng dụng nhận thông điệp từ hàng đợi bằng đoạn LRESULT CALLBACK WinProc (HWND, UINT, WPARAM, LPARAM); mã: • Trong đó tham số đầu tiên là định danh của cửa sổ, MSG msg; // Windows message structure tham số thứ 2 là định danh thông điệp, và cuối cùng while (GetMessage(&msg, NULL, 0,0)) { là 2 tham số WPARAM và LPARAM bổ sung thông TranslateMessage (&msg); tin kèm theo thông điệp. DispatchMessage (&msg); } Lập trình Windows 29 Lập trình Windows 30 Message Loop Message Loop • Trong đó msg là một biến cấu trúc kiểu MSG được • Hàm GetMessage sẽ trả về 0 nếu msg chứa định nghĩa trong winuser.h typedef struct tagMSG { thông điệp có định danh WM_QUIT HWND hwnd; (0x0012), khi đó vòng lặp thông điệp ngưng UINT message; WPARAM wParam; và ứng dụng kết thúc. LPARAM lParam; DWORD time; • Ngược lại thì hàm sẽ trả về một giá trị khác 0 POINT pt; với các thông điệp khác. } MSG, *PMSG; • POINT là kiểu tọa độ điểm, định nghĩa trong windef.h typedef struct tagPOINT { LONG x; LONG y; } POINT, *PPOINT; 31 Lập trình Windows 32 8
  9. Multitasking Hàm xử lý thông điệp WinProc - Ví dụ • Tìm hiểu một hàm xử lý cửa sổ: LRESULT CALLBACK WinProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; /*Xử lý các thông điệp cần thiết với ứng dụng*/ switch (msg){ 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ổ*/ hdc = BeginPaint (hwnd, &ps); GetClientRect (hwnd, &rect); Lập trình Windows 33 Lập trình Windows 34 Tóm tắt DrawText(hdc, "Hello", -1, &rect, DT_SINGLELINE| DT_CENTER| DT_VCENTER); EndPaint(hwnd, &ps); 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; } return DefWindowProc (hwnd, msg, wParam, lParam); } • Thông thường chỉ chặn để xử lý các thông điệp cần thiết, còn lại giao cho hàm xử lý mặc định DefWindowProc 35 Lập trình Windows 36 9
  10. 1.2.3. Chương trình Windows đơn giản Win32 Application in Visual C++ Developer Studio - Chương trình: HelloWorld (Sử dụng trực tiếp Windows API) - 2 hàm chính - Hàm WinMain: 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ổ - Vòng lặp nhận thông điệp v{ gửi tới thủ tục xử lý - Hàm WinProc: H{m xử lý thông điệp gửi đến. C|c thông điệp được Windows xử lý mặc định bằng h{m DefWindowProc() Lập trình Windows 37 Lập trình Windows 38 HelloWorld (1) HelloWorld (2) /* HELLOWORLD.C */ #include hwnd = CreateWindow(szAppName, // Tên lớp cửa sổ LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); TEXT (" The Hello World Program"), // int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) Tiêu đề cửa sổ { WS_OVERLAPPEDWINDOW, // Kiểu cửa sổ static TCHAR szAppName [] = TEXT ("HelloWorld"); CW_USEDEFAULT, // Toạ độ x HWND hwnd; CW_USEDEFAULT, // Toạ độ y MSG msg; CW_USEDEFAULT, // Chiều ngang WNDCLASS wndclass; CW_USEDEFAULT, // Chiều dọc wndclass.style = CS_HREDRAW|CS_VREDRAW; NULL, // Cửa sổ cha wndclass.lpfnWndProc = WndProc; NULL, // Thực đơn wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; hInstance, // Ðịnh danh wndclass.hInstance = hInstance; NULL); // Tham số wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); ShowWindow (hwnd, iCmdShow); wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); UpdateWindow (hwnd); wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); while (GetMessage (&msg, NULL, 0, 0)) { wndclass.lpszMenuName = NULL; TranslateMessage (&msg); wndclass.lpszClassName = szAppName; DispatchMessage (&msg); if (!RegisterClass (&wndclass)) { } MessageBox(NULL, TEXT (" The program requires Windows"), szAppName, return msg.wParam; MB_ICONERROR); } // End WinMain 39 Lập trình Windows 40 return 0; Lập trình Windows 10
  11. HelloWorld (3) HelloWorld (run) LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; switch (msg) { case WM_CREATE: return 0; case WM_PAINT: hdc = BeginPaint (hwnd, &ps); GetClientRect (hwnd, &rect); DrawText(hdc, TEXT("Hello World"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); EndPaint (hwnd, &ps); return 0; case WM_DESTROY: PostQuitMessage (0); return 0; } // End switch return DefWindowProc (hwnd, msg, wParam, lParam); } Lập trình Windows 41 Lập trình Windows 42 Ý nghĩa các hàm trong HelloWorld 1.3. Microsoft Foundation Classes (MFC) Tên hàm Ý nghĩa LoadIcon Nạp một biểu tượng để sử dụng trong chương trình. • MFC = Microsoft Foundation Classes LoadCursor Nạp một con trỏ chuột cho chương trình. Nhận một đối tượng đồ họa, trong trường hợp của • Thư viện c|c lớp đóng gói c|c h{m Win32 GetStockObject chương trình thì lấy một chổi tô để tô lại nền của cửa sổ. API Đăng ký một lớp cửa sổ cho cửa sổ ứng dụng trong RegisterClass chương trình. • Tập hợp các lớp C++ (methods, members) và MessageBox Hiển thị một thông điệp. CreateWindow Tạo một cửa sổ dựa trên một lớp cửa sổ. hàm toàn cục ShowWindow Hiển thị cửa sổ lên màn hình. UpdateWindow Yêu cầu cửa sổ vẽ lại chính bản thân nó. • Phát triển ứng dụng Windows dễ dàng, rút GetMesssage Nhận một thông điệp từ hàng đợi thông điệp. TranslateMessage Dịch thông điệp bàn phím. ngắn thời gian (so với lập trình Windows DispatchMessage Gởi thông điệp đến hàm xứ lý cửa sổ. BeginPaint Khởi tạo chức năng vẽ của cửa sổ. API). GetClientRect Lấy hình chữ nhật lưu vùng làm việc. DrawText Hiển thị một chuỗi văn bản. • Program user interface EndPaint Kết thúc việc vẽ cửa sổ. PostQuitMessage Đưa thông điệp thoát vào hàng đợi thông điệp. DefWindowProc Thực hiện việc xử lý mặc định các thông điệp. Lập trình Windows 43 44 11
  12. MFC và Win32 API MFC và Win32 API – Ví dụ • Win32 API: tập hợp các hàm, cấu trúc, thông • Khái niệm Win32 của một cửa sổ (window) được điệp, macros và interfaces đóng gói bởi lớp CWnd trong MFC. – Cho phép phát triển ứng dụng Win32 platforms. • CWnd chứa 1 biến thành viên kiểu HWND (kiểu dữ liệu định nghĩa Win32 biểu diễn một cửa sổ). – Program low-level, tiêu tốn thời gian. • CWnd chứa các phương thức đóng gói gọi đến các • MFC: hàm Win32 mà dùng HWND như 1 tham số. – Tái sử dụng code (reuse) và phát triển các thư • Ví dụ: viện. – Hàm: BOOL ShowWindow(HWND hWnd, int nCmdShow); – Đơn giản hóa và tăng tốc phát triển ứng dụng – Được đóng gói trong MFC: bằng cách cung cấp một tập các lớp C++ đóng gói BOOL CWnd::ShowWindow(int nCmdShow); các đặc điểm của Win32 API Lập trình Windows 45 Lập trình Windows 46 MFC Application Framework • Ngoài việc đóng gói của Win32 API, MFC còn định nghĩa một nhóm các lớp để biểu biễn các object ứng dụng chung và thiết lập mối quan hệ trong nhóm này để thực thi các hành vi của ứng dụng. • Application Framework: một nền tảng để xây dựng các ứng dụng. • Dùng MFC Wizard để tạo ra tập hợp các lớp dẫn xuất từ các lớp của framework. • Hoặc xây dựng các lớp mới theo yêu cầu sử dụng Lập trình Windows 47 Lập trình Windows 48 12
  13. Cấu trúc ứng dụng MFC 1.4. Lập trình Windows với VC++ 2008 • Ứng dụng MFC cung cấp: • 3 c|ch tạo ứng dụng Windows với VC++: – Một lớp biểu diễn ứng dụng (Application Class) – Ứng dụng sử dụng trực tiếp Windows API – Một lớp biểu diễn cửa sổ chính của ứng dụng (Win32 Project) (Main Window) – Ứng dụng sử dụng MFC – Triển khai h{m WinMain() (được ẩn đi) (MFC Application) (WinMain() Function) – Ứng dụng Windows Form (CLR/Windows Form Application) Lập trình Windows 49 Lập trình Windows 50 Môi trường phát triển tích hợp VC++ (2008) VC++ 2008 Developer Studio Environment IDE: -Solution ToolBox • The Solution (Workspace) Explorer • Output Pane -Class View • Editor Area -Resource View • Menu Bar Editor Area • Rearranging on the IDE Properties Output Lập trình Windows 51 Lập trình Windows 52 13
  14. The Solution Output Pane & Editor Area • Solution Explorer: allows you to view and • Output Pane: navigate all the files that make up your – Cung cấp thông tin cho người lập trình application. – Compiler progress statements – Warnings, error messages • Class View allows you to navigate and – Thông tin debugger: manipulate your source code on a C++ class – Current values of variables when step through code. (Cửa level. sổ Watch) • Resource View: allows you to find and edit • Editor Area: each of the various resources in your – Soạn thảo m~ lệnh – Thiết kế giao diện (Design mode) application, including dialog window – Icon Editor designs, icons, and menus. Lập trình Windows 53 Lập trình Windows 54 Menu Bar + Rearranging IDE C|c th{nh phần ứng dụng ph|t triển với VC++ • Menu bar + Tool bars • Standard toolbar • Build toolbar • Text Editor • …. • Add/remove Toolbars • Kéo thả, bố trí c|c cửa sổ l{m việc • Floating, Dock, Auto hiden, …. Lập trình Windows 55 56 14
  15. Character Sets, và _T macro (1) Character Sets, và _T macro (2) • Old Windows: Tập ký tự ANSI 8 bit • Dùng macro _T (của MFC) cho chuỗi dạng • Windows NT: Tập ký tự Unicode 16 bit (bao _T(“Hello”) thì kết quả sẽ được thể hiện dạng trùm ANSI). Unicode nếu ký hiệu tiền xử lý _UNICODE • Biên dịch ứng dụng VC++ trên Windows NT được định nghĩa (chọn kiểu chuỗi ký tự có thể chọn sử dụng Unicode hoặc không. Unicode cho ứng dụng), nếu không mặc định • Nếu một chuỗi “Hello” thì trình biên dịch sẽ l{ ký tự ANSI. thể hiện dạng ANSI (8bit/1 ký tự). • Nếu chuỗi L”Hello” thì trình biên dịch sẽ thể hiện dạng chuỗi Unicode. Lập trình Windows 57 58 Character Sets và _T macro (3) Exercises Chapter 1. • Kiểu TCHAR (dùng thay cho kiểu char): • Ex1-1. HelloWorld – L{ wchar_t (Unicode 16 bit) nếu _UNICODE được định nghĩa – Tạo project Win32 Project như ví dụ lý thuyết – L{ char (ANSI 8 bit) nếu _UNICODE không được định – Triển khai h{m WinMain, WinProc, cơ chế thông nghĩa điệp • Tương tự, nên dùng TCHAR* hoặc LPTSTR (con • Ex1-2. HelloMFC trỏ chuỗi) thay cho wchar_t*, hoặc char*. – Tìm hiểu sử dụng IDE Visual studio • LPCTSTR: con trỏ tới chuỗi hằng – Tạo project MFC appllication, sử dụng Wizard • Sử dụng sizeof(TCHAR) để x|c định độ rộng ký tự – Code view, design view (8 hay 16 bit) – Compile, debug, run • Sử dụng c|c macro trong thư viện tchar.h thay cho c|c h{m xử lý ký tự/chuỗi của thư viện C-runtime. Ví dụ: _tcscpy thay cho h{m strcpy( ) 59 Lập trình Windows 60 15
  16. Create a project Sử dụng Wizard Chọn kiểu ứng dụng Tên ứng dụng Sử dụng thư viện Unicode Lập trình Windows Lập trình Windows 61 62 Thiết kế giao diện ứng dụng (Dialog) Add code to greeting (1) • Button “Hello”: Right Mouse/Add Event Handler Chọn sự kiện, tên hàm xử lý Lập trình Windows 63 Lập trình Windows 64 16
  17. Add code to greeting (2) Compile, Build, Debug, Run Ví dụ gọi hộp thoại Compile (Ctrl+F7), thông báo Build (F6), Debug (F5), Run without Debug (Ctrl+F5) void CHelloMFCDlg::OnBnClickedButtonHello() Set Breakpoint (F9) and Run Debug { // TODO: Add your control notification handler code here MessageBox(L"Xin chào ! Lập trình Windows", L"First MFC Application"); } Lập trình Windows 65 Chương 2. Lập trình Windows VC++/MFC 2.1. Message Map trong MFC (1) • 2.1. \nh xạ thông điệp trong MFC • Lập trình MFC cho phép viết c|c h{m để xử lý c|c thông điệp (messages) mong muốn. (Ngo{i c|c xử • 2.2. Document/View trong MFC lý mặc định được MFC cung cấp). • 2.3. Menu và Toolbar • Gọi l{ c|c message handlers (hoặc handlers). • 2.4. Xử lý vẽ (Drawing) (cũng l{ h{m th{nh viên của lớp v{ được ph}n biệt • 2.5. Giao tiếp b{n phím/chuột bằng tiền tố afx_msg). • Cơ chế liên kết giữa thông điệp v{ h{m xử lý được • 2.6. Hộp thoại (Dialogs) x|c định bởi Message Map (\nh xạ thông điệp) • 2.7. Sử dụng các điều khiển (controls) Lập trình Windows 67 Lập trình Windows 68 17
  18. 2.1. Message Map trong MFC (2) 2.1. Message Map trong MFC (3) • Mỗi lớp có xử lý thông điệp sẽ triển khai một • Xét một ví dụ ứng dụng MFC đơn giản: Message Map. Sử dụng c|c macro: – DECLARE_MESSAGE_MAP() trong file .h – Cặp BEGIN_MESSAGE_MAP() v{ END_MESSAGE_MAP() trong file .cpp (Cặp n{y bao một danh s|ch c|c h{m xử lý tương ứng với c|c thông điệp) Lập trình Windows 69 Lập trình Windows 70 Message Map trong MFC (2) Qu| trình xử lý thông điệp trong MFC Lập trình Windows 71 Lập trình Windows 72 18
  19. Ph}n loại thông điệp trong MFC Add Message Handlers Message Description • Có thể l{m thủ công Category (Manual) (Viết trong Windows Thông điệp chuẩn của Windows, bắt đầu với WM_ Message Map). Messages (Ngoại trừ c|c thông điệp WM_COMMAND) Ví dụ: WM_PAINT, WM_LBUTTONUP, … • Hoặc chọn Properties/Message Control Các thông điệp WM_COMMAND được gửi từ c|c điều Notification khiển (Controls) như Button, CheckBox, … đến cửa sổ Messages chứa chúng, hoặc từ cửa sổ con đến cửa sổ cha. Tham số đi kèm (IDs) cho biết gửi từ controls n{o BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx) ON_WM_CREATE() Command Cũng l{ c|c thông điệp WM_COMMAND nhưng được ON_COMMAND(ID_WINDOW_MANAGER, Messages từ c|c th{nh phần giao diện người dùng như menu &CMainFrame::OnWindowManager) items, toolbar buttons. (Được MFC định nghĩa c|c IDs ON_COMMAND(ID_VIEW_CUSTOMIZE, &CMainFrame::OnViewCustomize) chuẩn, người dùng có thể tạo thêm) ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR, &CMainFrame::OnToolbarCreateNew) ON_WM_CHAR() Lập trình Windows 73 END_MESSAGE_MAP() Lập trình Windows 74 2.2. Document/View trong MFC Document/View trong MFC • Document: Tập hợp dữ liệu của ứng dụng • Có thể lựa chọn Document Interfaces: (dẫn xuất từ lớp CDocument) – SDI (Single Document Interface): Hiển thị một t{i liệu (Document) mỗi lần trên một cửa sổ (view) • View: Cơ chế – MDI (Multiple Document Interface): Cho phép hiển thị dữ liệu mở nhiều t{i liệu một lúc trong Document • Đều được hợp th{nh bởi c|c th{nh phần (dẫn xuất từ lớp CDocument và Cview CView) • Có thể tạo ứng dụng MFC kiểu kiến trúc SDI/MDI Lập trình Windows 75 Lập trình Windows 76 19
  20. Khung ứng dụng dạng SDI Khung ứng dụng dạng MDI • Chỉ mở một t{i liệu • Cho phép mở nhiều t{i liệu Lập trình Windows 77 Lập trình Windows 78 Ứng dụng MFC based Document/View Ứng dụng MFC based Document/View • Trong qu| trình tạo ứng dụng dạng SDI v{ • Kiểu SDI MDI, c|c class được tạo ra hầu hết được kế thừa (dẫn xuất) từ c|c class như: – Với dạng SDI: CWinApp, CFrameWnd, CDocument, CView – Với dạng MDI: CWinApp, CMDIFrameWnd, CMDIChildWnd, CDocument, CView Lập trình Windows 79 80 20
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2