1
Chương 2: Lập trình với cửa sổ bằng API
Cách tổ chức quản lý cửa sổ
Đăng ký, tạo và hiện cửa sổ
Vòng lặp TĐ và hàm cửa sổ
Một số thông điệp cơ bản
Một số hàm API
2
2.1- Tổ chức và quản lý cửa sổ trên Windows
Lớp cửa sổ (WNDCLASS) mô tả cấu tạo và hoạt động cho cửa
sổ, gồm:
Lớp cửa sổ thông thường
Lớp cửa sổ dạng hộp thoại
Lớp cửa sổ dạng điều khiển như “edit”, “static”, “button”,
Số hiệu (HWND) là số nguyên định danh cho cửa sổ
Hàm cửa sổ (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ửa sổ
User
3
Đăng ký lớp cửa sổ
Bước 1: Thiết lập cấu trúc mô tả lớp cửa sổ
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ửa sổ
4
2.2- Đăng ký, tạo và hiện cửa sổ
Lệnh tạo và hiện cửa sổ
HWND CreateWindow(
class, tên lớp cửa sổ (“edit”, “static”, “button”, hoặc đã đăng ký)
title, tiêu đề cửa sổ
style, kiểu cửa sổ (WS_SYSMENU, WS_POPUP,
WS_OVERLAPPEDWINDOW, )
xpos, ypos, tọa độ vị trí góc trái trên cửa sổ
width, height, độ rộng và cao
parent, số hiệu cửa sổ chứa =0
menu, số hiệu thực đơn =0
hinstance, số hiệu chương trình
more=0 );
BOOL ShowWindow( hwnd, show );
BOOL UpdateWindow( hwnd );
5
Lập trì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ửa sổ
Windows
Cửa sổ
Chương trì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ửa sổ
Lập trì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ửa sổ 1
Cửa sổ 2
Cửa sổ 3
Hàm WinMain
Vòng lặp thông điệp
Hàm cửa sổ 1
Hàm cửa sổ 2
Hàm cửa sổ 3
Tác động
USER
Sự kiện
tác động
Hàng đợi
thông điệp
Xác định
hàm cửa sổ
Thông điệp
nhận
2.3- Vòng lặp TĐ & hàm cửa sổ
8
WM_CLOSE
WM_TIMER { t3 = ID chu kỳ thời gian }
WM_SHOWWINDOW
WPARAM = TRUE/FALSE, cửa sổ 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ửa sổ
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ửa sổ 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ửa sổ 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