Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 20 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
20
Dung lượng
169,04 KB
Nội dung
Cách viết ứng dụng microsoft windows Cách viết ứng dụng microsoft windows Bởi: Nguyendinhquyen nguyenhagiang Các thành phần tạo nên ứng dụng Cửa sổ Trong ứng dụng đồ họa 32-bit, cửa sổ (window) vùng hình chữ nhật hình, nơi mà ứng dụng hiển thị thơng tin nhận thông tin vào từ người sử dụng Do vậy, nhiệm vụ ứng dụng đồ họa 32-bit tạo cửa sổ Một cửa sổ chia sẻ hình với cửa sổ khác ứng dụng hay ứng dụng khác Chỉ cửa sổ thời điểm nhận thông tin nhập từ người dùng Người sử dụng dùng bàn phím, thiết bị chuột hay thiết bị nhập liệu khác để tương tác với cửa sổ ứng dụng Tất cửa sổ tạo từ cấu trúc cung cấp sẵn gọi lớp cửa sổ (window class) Cấu trúc tập mơ tả thuộc tính mà hệ thống dùng khuôn mẫu để tạo nên cửa sổ Mỗi cửa sổ phải thành viên lớp cửa sổ Tất lớp cửa sổ xử lý riêng biệt 1/20 Cách viết ứng dụng microsoft windows Hình 1.1 Minh họa cửa sổ Hộp thoại điều khiển Hộp thoại (Dialog) dùng để tương tác với người dùng chương trình ứng dụng Một hộp thoại thường chứa nhiều khiển ô nhập văn (edit text), nút bấm (button), ghi (static control), hộp danh sách (list box)… Nút bấm (button): gồm có Push Button dùng kích hoạt thao tác, Check Box dùng để chọn hai trạng thái (TRUE hay FALSE), Radio Button giống Check Box nhóm Radio Button phải chọn loại trừ ? Chú thích (static): dùng để chứa ghi hộp thoại, ngồi nội dung thay đổi trình sử dụng hộp thoại Hộp liệt kê (list box): Chọn hay nhiều liệu liệt kê danh sách, hộp chứa nhiều dòng hộp khơng hiển thị hết mẫu thơng tin phải kèm theo cuộn (scroll bar) Ô nhập văn (edit text): Dùng nhập văn bản, có nhiều dịng thường kèm theo cuộn Thanh cuộn (scroll bar): việc dùng kèm với list box hay edit box cuộncịn sử dụng độc lập nhằm tạo thước đo… Thực đơn (menu): danh sách chứa thao tác với định danh mà người dùng chọn Hầu hết ứng dụng có cửa sổ khơng thể thiếu thực đơn 2/20 Cách viết ứng dụng microsoft windows Thanh công cụ (toolbar): dạng menu chứa thao tác cần thiết dạng biểu tượng đặc trưng Ngồi cịn nhiều điều khiển mà cơng cụ lập trình cung cấp cho người lập trình hay tự họ tạo dựa thành phần cung cấp sẵn Ứng dụng điển hình Windows Hình 1.2 Minh họa ứng dụng Windows Các kiểu tập tin để xây dựng ứng dụng Windows Chương trình nguồn Tương tự chương trình C chuẩn, bao gồm tập tin tiêu đề (header) chứa tập tin *.h, *.hpp Còn mã nguồn (source code) chứa tập tin *.c hay *.cpp Tập tin định nghĩa Tập tin có phần mở rộng *.def, dùng định nghĩa điều khiển chương trình tạo viết ứng dụng tạo DLL, ngồi cịn dùng để khai báo vùng nhớ heap chạy chương trình Lúc trước vấn đề tương thích với Windows 3.1 nên tập tin thường dùng, cịn ngày chúng dùng đến Các file chứa tài nguyên ứng dụng 3/20 Cách viết ứng dụng microsoft windows Các file *.ico biểu tượng (icon) dùng chương trình Thơng thường cơng cụ lập trình Windows có tool để tạo ảnh Con trỏ chuột ứng dụng vẽ lại dạng biểu tượng lưu đĩa với dạng file *.cur Các file dạng ảnh bitmap dùng để minh họa lưu dạng file *.bmp Tập tin tài nguyên *.rc phần khai báo tài nguyên thực đơn, hộp thoại, định danh đến tập tin dạng *.ico, *.cur, *.bmp, Các kiểu liệu Các kiểu liệu Windows thường định nghĩa nhờ toán tử typedef tập tin windows.h hay tập tin khác Thông thường tập tin định nghĩa Microsoft viết cơng ty viết trình biên dịch C tạo ra, thiết phải tương thích với hệ điều hành Windows 98, hay NT dựa kiến trúc 32-bit Một vài kiểu liệu có tên viết tắt dễ hiểu UINT liệu thường dùng mà đơn giản kiểu unsigned int, Windows 9x kiểu có kích thước 32-bit Đối với kiểu chuỗi có kiểu PSTR kiểu trỏ đến chuỗi tương tự char* Tuy nhiên, có số kiểu khái báo tên thiếu rõ ràng WPARAM LPARAM Tên đặt có nguồn ngốc lịch sử sâu xa Khi cịn hệ điều hành Windows 16-bit tham số thứ hàm WndProc khai báo kiểu WORD, với kích thước 16-bit , cịn tham số thứ có kiểu LONG 32-bit Đây lý người ta thêm tiến tố "W", "L" vào từ "PARAM" Tuy nhiên, phiên Windows 32-bit, WPARAM định nghĩa UINT LPARAM định nghĩa kiểu LONG, hai tham số có giá trị 32-bit Điều nhầm lẫn WORD giá trị 16-bit Window 98 Trong thủ tục xử lý cửa sổ WndProc giá trị trả kiểu LRESULT Kiểu đơn giản định nghĩa kiểu LONG Ngoài ra, có kiểu thường xuyên dùng kiểu HANDLE số nguyên 32-bit sử dụng kiểu định danh Có nhiều kiểu định danh thiết tất phải có kích thước với HANDLE Bảng sau mô tả số kiểu liệu mới: Kiểu Ý nghĩa HANDLE Số nguyên 32-bit, định danh 4/20 Cách viết ứng dụng microsoft windows HWND Số nguyên 32-bit, định danh BYTE Giá trị 8-bit không dấu WORD Số nguyên 16-bit không dấu DWORD Số nguyên 32-bit không dấu UINT Số nguyên không dấu 32-bit LONG long 32-bit BOOL Bool LPSTR Con trỏ chuỗi LPCSTR Hằng trỏ chuỗi WPARAM 32-bit LPARAM 32-bit BSTR Giá trị 32-bit trỏ đến kí tự LPVOID Con trỏ 32-bit đến kiểu khơng xác định LPTSTR Giống LPSTR chuyển sang dạng Unicode DBCS LPCTSTR Giống LPCTSTR chuyển sang dạng Unicode DBCS Bảng 1.1 Mô tả kiểu liệu Khuôn mẫu chung tạo ứng dụng Một ứng dụng đơn giản Windows bao gồm có hai hàm WinMain xử lý cửa sổ WinProc Do hai hàm quan trọng thiếu ứng dụng Windows Hàm WinMain thực chức sau : Định nghĩa lớp cửa sổ ứng dụng Đăng ký lớp cửa sổ vừa định nghĩa Tạo thể cửa sổ lớp cho Hiển thị cửa sổ 5/20 Cách viết ứng dụng microsoft windows Khởi động chu trình xử lý thơng điệp Hàm xử lý WinProc có chức xử lý tất thơng điệp có liên quan đến cửa sổ Hàm WinMain Hàm ứng dụng chạy Windows hàm WinMain, khai báo sau: int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow); Chúng ta tìm hiểu hàm WinMain mẫu sau int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT("HelloWin"); // tên ứng dụng HWND hwnd; MSG msg; WNDCLASS wndclass; // biến để định nghĩa 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; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; // Định danh ứng dụng wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclass.hCursor = LoadCusor (NULL, IDC_ARROW); 6/20 Cách viết ứng dụng microsoft windows wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; // Khơng có menu wndclass.lpszClassName = szAppName; // tên ứng dụng /* Đăng ký lớp cửa sổ */ if (!RegisterClass(&wndclass)) return 0; /* 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 /* Hiển thị cửa sổ */ ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); /* Chu trình xử lý thơng điệp*/ while (GetMessage (&msg, NULL, 0, 0)) 7/20 Cách viết ứng dụng microsoft windows { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } Định nghĩa lớp cửa sổ : Đầu tiên viêc xây dựng ứng dụng Windows phải định nghĩa lớp cửa sổ cho ứng dụng Windows cung cấp cấu trúc WNDCLASS gọi lớp cửa sổ, lớp chứa thuộc tính tạo thành cửa sổ typedef struct _WNDCLASS { UINT style; WNDPROC lpfnWndProc; int cbClsExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCSTR lpszMenuName; LPCSTR lpszClassName; }WNDCLASS, *PWNDCLASS; Ý nghĩa thuộc tính cấu trúc WNDCLASS mơ tả bảng sau : 8/20 Cách viết ứng dụng microsoft windows Thuộc tính Ý nghĩa ghi style Kiểu lớp Kết hợp nhiều kiểu giá trị khác toán tử OR lpfnWndProc Con trỏ đến thủ tục window cbClsExtra Số byte cấp phát thêm sau cấu trúc window- Mặc định class cbWndExtra Số byte cấp phát thêm sau instance window hInstance Định danh chứa thủ tục cửa sổ lớp window hIcon Định danh biểu tượng Dùng hàm LoadIcon hCursor Định danh trỏ chuột Dùng hàm LoadCursor Mặc định hbrBackground Định danh chổi tô Dùng hàm GetStockObject lpszMenuName Tên thực đơn Tên thực đơn gắn với cửa sổ, thực dơn khai báo tập tin tài nguyên lpszClassName Tên lớp Bảng 1.2 Mơ tả thuộc tính lớp cửa sổ Đăng ký lớp cửa sổ : Sau định nghĩa lớp cửa sổ, phải đăng ký lớp cửa sổ hàm RegisterClass : ATOM RegisterClass( CONST WNDCLASS * lpWndClass ); Tạo cửa sổ : Lớp cửa sổ định nghĩa đặc tính chung cửa sổ, cho phép tạo nhiều cửa sổ dựa lớp Khi tạo cửa sổ hàm CreateWindow, ta định đặc tính riêng cửa sổ này, phân biệt với cửa sổ khác tạo lớp 9/20 Cách viết ứng dụng microsoft windows Khai báo hàm tạo cửa sổ : HWND CreateWindow( LPCSTR lpClassName, // Tên lớp cửa sổ đăng ký LPCSTR lpwindowName, // Tên cửa sổ DWORD dwStyle, // Kiểu cửa sổ int x, // Vị trí ngang ban đầu int y, // Vị trí dọc ban đầu int nWidth, // Độ rộng ban đầu int nHeight, // Độ cao ban đầu HWND hWndParent, // Định danh cửa sổ cha MENU hMenu, // Định dang thực đơn INSTANCE hInstance, // Định danh thể ứng dụng PVOID lpParam // Các tham số ban đầu ); Hiển thị cửa sổ : Sau gọi hàm CreateWindow, cửa sổ tạo bên Windows, điều có ý nghĩa Windows cáp phát vùng nhớ để lưu giữ tất thông tin cửa sổ định hàm CreateWindow Những thơng số Windows tìm lại cần thiết dựa vào định danh mà hàm tạo cửa sổ trả Tuy nhiên, lúc cửa sổ chưa xuất hình Windows, để xuất cần phải gọi hàm ShowWindow Hàm ShowWindow có khai báo sau: BOOL ShowWindow( HWND hWnd, // Định danh cửa sổ cần thể int nCmdShow // Trạng thái hiển thị 10/20 Cách viết ứng dụng microsoft windows ); Một số trạng thái tham số nCmdShow: SW_HIDE : Ẩn cửa sổ SW_MAXIMIZE : Phóng cửa sổ tồn hình SW_MINIMIZE : thu nhỏ thành biểu tượng hình SW_RESTORE : Hiển thị dạng chuẩn Hàm xử lý cửa sổ WndProc Một chương trình Windows chứa nhiều hàm xử lý cửa sổ Một hàm xử lý cửa sổ kết hợp với lớp cửa sổ đặc thù Hàm xử lý cửa sổ thường đặt tên WndProc Hàm WndProc có chức giao tiếp với bên ngồi, tức với Windows, tồn thơng điệp gởi đến cửa sổ điều xử lý qua hàm Hàm thường khai báo sau : LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM, LPARAM ); Trong tham số định danh cửa sổ, tham số thứ định danh thông điệp, cuối tham số WPARAM LPARAM bổ sung thông tin kèm theo thông điệp Chúng ta tìm hiều hàm xử lý cửa sổ WndProc sau: LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; /*Xử lý thông điệp cần thiết với ứng dụng*/ 11/20 Cách viết ứng dụng microsoft windows switch (msg) { case WM_CREATE: /*Viết đoạn mã tạo cửa sổ*/ return 0; case WM_PAINT: /*Viết đoạn mã tô vẽ lại cửa sổ*/ hdc = BeginPaint ( hwnd, &ps); GetClientRect (hwnd, &rect); DrawText(hdc, "Hello", -1, &rect, DT_SINGLELINE| DT_CENTER| DT_VCENTER); EndPaint ( hwnd, &ps); return 0; case WM_SIZE: /*Viết đoạn mã 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); 12/20 Cách viết ứng dụng microsoft windows } Thông thường chặn để xử lý thông điệp cần thiết có liên quan đến chức ứng dụng Các thơng điệp khác giao cho hàm xử lý mặc định làm việc (hàm DefWindowProc) Xử lý thông điệp Sau cửa sổ hiển thị hình, chương trình phải đọc thơng tin nhập người dùng từ bàn phím hay thiết bị chuột Windows trì hàng đợi thơng điệp cho chương trình chạy Khi kiện nhập thơng tin xuất hiện, Windows dịch kiện thành dạng thơng điệp đưa vào hàng đợi thơng điệp ứng dụng tương ứng Một ứng dụng nhận thông điệp từ hàng đợi thông điệp cách thực thi đoạn mã sau: while ( GetMessage(&msg, NULL, ,0) ) { TranslateMessage (&msg); DispatchMessage (&msg); } Trong msg biến cấu trúc kiểu MSG định nghĩa tập tin tiêu đề WINUSER.H typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; 13/20 Cách viết ứng dụng microsoft windows POINT pt; }MSG, *PMSG; Kiểu liệu POINT kiểu cấu trúc khác, định nghĩa tập tin tiêu đề WINDEF.H, có mơ tả : typedef struct tagPOINT { LONG x; LONG y; } POINT, *PPOINT; Ý nghĩa trường cấu trúc MSG hwnd : Định danh cửa sỗ mà thông điệp phát sinh message : Định danh thơng điệp, ví dụ thông điệp phát sinh bấm nút chuột trái WM_LBUTTONDOWN có giá trị 0x0201 wParam : Tham số 32-bit chứa thông tin phụ thuộc vào thông điệp cụ thể lParam : Tham số 32-bit phụ thuộc vào thông điệp time : Thời gian đặt thông điệp hàng đợi pt : Tọa độ chuột đặt thông điệp vào hàng đợi Hàm GetMessage trả msg chứa thơng điệp có định danh WM_QUIT (0x0012), vịng lặp thơng điệp ngưng ứng dụng kết thúc Ngược lại hàm trả giá trị khác với thông điệp khác Xây dựng ứng dụng Một ứng dụng thường có giao diện tảng khung cửa sổ, để tạo cửa sổ thực cách khai báo lớp cửa sổ đăng ký lớp cửa sổ Để cửa sổ tương tác phải viết hàm xử lý cửa sổ WndProc tất thơng điệp liên quan đến cửa sổ truyền vào cho hàm Đoạn chương trình sau khung sườn cho chương trình viết Windows, bao gồm hàm : 14/20 Cách viết ứng dụng microsoft windows WinMain : hàm chương trình thực chức : Khai báo lớp cửa sổ Đăng ký lớp cửa sổ vừa khai báo Tạo hiển thị lớp cửa sổ 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ổ /* HELLOWORLD.C */ #include LRESULTCALLBACK WndProc ( HWND, UINT, WPARAM, LPARAM ); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow ) { static TCHAR szAppName [] = TEXT ("HelloWorld"); HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style = CS_HREDRAW|CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon ( NULL, IDI_APPLICATION ); wndclass.hCursor = LoadCursor ( NULL, IDC_ARROW ); 15/20 Cách viết ứng dụng microsoft windows wndclass.hbrBackground = ( HBRUSH ) GetStockObject ( WHITE_BRUSH ); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; if ( !RegisterClass ( &wndclass ) ) { MessageBox(NULL, TEXT (" The program requires Windows"), szAppName, MB_ICONERROR ); return 0; } hwnd = CreateWindow ( szAppName, // Tên lớp cửa sổ TEXT (" The Hello World Program"), // Tiêu đề cửa sổ WS_OVERLAPPEDWINDOW, // Kiểu cửa sổ CW_USEDEFAULT, // Tọa độ x CW_USEDEFAULT, // Tọa độ y CW_USEDEFAULT, // Chiều ngang CW_USEDEFAULT, // Chiều dọc NULL, // Cửa sổ cha NULL, // Thực đơn hInstance, // Định danh NULL ); // Tham số ShowWindow ( hwnd, iCmdShow ); UpdateWindow ( hwnd ); 16/20 Cách viết ứng dụng microsoft windows while ( GetMessage ( &msg, NULL, 0, 0) ) { TranslateMessage (&msg); DispatchMessage (&msg) ; } return msg.wParam; } // End WinMain 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); 17/20 Cách viết ứng dụng microsoft windows return 0; case WM_DESTROY: PostQuitMessage (0); return 0; } // End switch return DefWindowProc ( hwnd, msg, wParam, lParam); } Bảng liệt kê ý nghĩa hàm sử dụng hàm WinMain WndProc chương trình HELLOWORLD.C Tên hàm Ý nghĩa LoadIcon Nạp biểu tượng để sử dụng chương trình LoadCursor Nap trỏ chuột cho chương trình GetStockObject Nhận đối tượng đồ họa, trường hợp chương trình lấy chổi tơ để tơ lại cửa sổ RegisterClass Đăng ký lớp cửa sổ cho cửa sổ ứng dụng chương trình MessageBox Hiển thị thông điệp CreateWindow Tạo cửa sổ dựa lớp cửa sổ ShowWindow Hiển thị cửa sổ lên hình UpdateWindow Yêu cầu cửa sổ vẽ lại thân GetMesssage Nhận thơng điệp từ hàng đợi thông điệp TranslateMessage Dịch thông điệp bàn phím DispatchMessage Gởi thơng điệp đến hàm xứ lý cửa sổ BeginPaint Khởi tạo chức vẽ cửa sổ GetClientRect Lấy hình chữ nhật lưu vùng làm việc DrawText Hiển thị chuỗi văn EndPaint Kết thúc việc vẽ cửa sổ 18/20 Cách viết ứng dụng microsoft windows PostQuitMessage Đưa thơng điệp vào hàng đợi thông điệp DefWindowProc Thực việc xử lý mặc định thông điệp Bảng 1.3 Mô tả hàm sử dụng chương trình minh họa Một số qui ước đặt tên biến Khi viết chương trình ứng dụng lớn với nhiều kiểu khai báo biến khác nhau, việc khai báo tên biến khơng thích hợp làm cho chương trình phức tạp thêm, đơi làm khó người viết mã nguồn Vì lập trình viên thường qui ước cho tên biến vừa gợi chức vừa xác định kiểu loại Có nhiều phong cách để đặt tên, số có phong cách đặt tên theo cú pháp Hungary (Hungarian Notation) dùng nhiều Qui ước đơn giản bắt đầu tên biến viết chữ thường chữ đầu thể kiểu liệu biến, gọi tiền tố Ví dụ biến szCmdLine biến lưu chuỗi nhập từ dòng lệnh, sz thể cho biến kiểu chuỗi kết thúc ký tự 0, ta hay thấy hInstance hPrevInstance, h viết tắt cho kiểu handle, kiểu liệu nguyên thường khai báo dạng tiến tố chữ i Cú pháp Hungary giúp cho người lập trình nhiều khâu kiểm tra lỗi chương trình, nhìn vào hai biến ta dễ dàng nhận biết đựơc khơng tương thích hai kiểu liệu thể tên hai biến Bảng mô tả số tiền tố đặt tên biến kiểu liệu : Tiền tố Kiểu liệu c char, WCHAR, TCHAR by BYTE n short i int x,y biến lưu tọa độ x, y b BOOL w WORD l long dw DWORD s string 19/20 Cách viết ứng dụng microsoft windows sz chuỗi kết thúc kí tự h handle p pointer Lpsz trỏ dài chuỗi ký tự kết thúc kí tự Bảng 1.4 Mơ tả kiểu đặt tên biến 20/20