1 Chương 2: Lập trìnhvới cửa sổbằngAPI Cách tổ chức quản lý cửasổ Đăng ký, tạo và hiện cửasổ Vòng lặp TĐ và hàm cửasổ Một số thông điệp cơ bản Một số hàm API2 2.1- Tổ chức và quản lý cửasổ trên Windows Lớp cửasổ (WNDCLASS) mô tả cấu tạo và hoạt động cho cửa sổ, gồm: Lớp cửasổ thông thường Lớp cửasổ dạng hộp thoại Lớp cửasổ dạng điều khiển như “edit”, “static”, “button”, Số hiệu (HWND) là số nguyên định danh cho cửasổ Hàm cửasổ (WNDPROC) để thực hiện xử lý các họat động trên cửa sổ, mặc định là DefWindowProc. Windows Register WNDCLASS Create WNDPROC Cửasổ User 3 Đăng ký lớp cửasổ Bước 1: Thiết lập cấu trúc mô tả lớp cửasổ WNDCLASS a; ZeroMemory( &a, sizeof(a) ); a.style = 1; a.lpfnWndProc = DefWindowProc; a.hInstance = t1; a.hbrBackground = CreateSolidBrush( 255 ); a.lpszClassName = “CS1”; Bước 2: Đăng ký vào hệ thống RegisterClass( &a ); 2.2- Đăng ký, tạo và hiện cửasổ 4 2.2- Đăng ký, tạo và hiện cửasổ Lệnh tạo và hiện cửasổ HWND CreateWindow( class, tên lớp cửasổ (“edit”, “static”, “button”, hoặc đã đăng ký) title, tiêu đề cửasổ style, kiểu cửasổ (WS_SYSMENU, WS_POPUP, WS_OVERLAPPEDWINDOW, ) xpos, ypos, tọa độ vị trí góc trái trên cửasổ width, height, độ rộng và cao parent, số hiệu cửasổ chứa =0 menu, số hiệu thực đơn =0 hinstance, số hiệu chươngtrình more=0 ); BOOL ShowWindow( hwnd, show ); BOOL UpdateWindow( hwnd ); 5 Lậptrình vòng lặp thông điệp MSG m; while ( GetMessage( &m, 0, 0, 0 ) ) { TranslateMessage( &m ); DispatchMessage( &m ); } 2.3- Vòng lặp TĐ & hàm cửasổ Windows CửasổChươngtrình Tác động của người dùng Sự kiện chuyển tới Windows Windows chuyển thông điệp tới Vòng lặp TĐ Hàm XLTĐ C a l l i n g A P I 6 2.3- Vòng lặp TĐ & hàm cửasổ Lậptrình hàm XLTĐ theo tham số t2 LRESULT CALLBACK tên_hàm( HWND t1, UINT t2, WPARAM t3, LPARAM t4 ) { switch ( t2 ) { case thông-điệp-1 : < xử lý thông điệp 1 > break; case thông-điệp-2 : < xử lý thông điệp 2 > break; } return DefWindowProc( t1, t2, t3, t4 ); } Thông thường xử lý thông điệp thì nên return 0; 7 Windows Cửasổ 1 Cửasổ2Cửasổ 3 Hàm WinMain Vòng lặp thông điệp Hàm cửasổ 1 Hàm cửasổ2 Hàm cửasổ 3 Tác động USER Sự kiện tác động Hàng đợi thông điệp Xác định hàm cửasổ Thông điệp nhận 2.3- Vòng lặp TĐ & hàm cửasổ 8 WM_CLOSE WM_TIMER { t3 = ID chu kỳ thời gian } WM_SHOWWINDOW WPARAM = TRUE/FALSE, cửasổ hiện hoặc ẩn LPARAM = SW_OTHERUNZOOM, SW_PARENTCLOSING, lý do hiển thị WM_MOVE, WM_MOVING WM_MOVE có LPARAM = LOWORD:tọa độ x; HIWORD:tọa độ y WM_MOVING có LPARAM = LPRECT{left,top,right,bottom} tọa độ & kích thước WM_SIZE, WM_SIZING WPARAM = {SIZE_MAXIMIZED, SIZE_MINIMIZED, } trạng thái cửasổ LPARAM = LOWRD:độ rộng nền; HIWORD:độ cao nền WM_ACTIVATE WPARAM = WA_ACTIVE, WA_INACTIVE, WA_CLICKACTVE WM_QUIT 2.4- Một số thông điệp cơ bản 9 Cửasổ trong suốt (WinXP) typedef BOOL (WINAPI* CTH)(HWND,COLORREF,BYTE,DWORD); HANDLE a = GetModuleHandle( “USER32.DLL” ); CTH b = (CTH)GetProcAddress(a,“SetLayeredWindowAttributes”); HWND c = CreateWindowEx( 0x00080000L, ); b( c, 0, 127, 2 ); Cửasổ dạng topmost CreateWindowEx( WS_EX_TOPMOST, … ); Khóa bàn phím và chuột (WinXP) typedef BOOL (WINAPI* CTH)( BOOL ); HANDLE a = GetModuleHandle( “USER32.DLL” ); CTH b = (CTH)GetProcAddress(a, “BlockInput”); Khóa b( 1 ); hoặc hủy bỏ b( 0 ); 2.5- Một số lệnh API khác 10 Ẩn/hiện taskbar HWND h1; h1 = FindWindow( "Shell_traywnd", 0); ShowWindow( h1, SW_HIDE); // or SW_SHOW Ẩn/hiện start button HWND h1,h2; h1 = FindWindow( "Shell_traywnd", 0); h2 = FindWindowEx( h1, 0, "Button", 0); ShowWindow( h2, SW_HIDE); // or SW_SHOW Ẩn/hiện desktop icon HWND h1; h1 = FindWindowEx( 0,0,“Progman", 0); ShowWindow( h1, SW_HIDE); // or SW_SHOW 2.5- Một số lệnh API khác