Bài 5
Bàn phím, chuột và bộ định
thời gian
Mai Xuân Hùng
1
Bài 5
Bàn phím, chuột và bộ định
thời gian
Mai Xuân Hùng
2
Những thông điệp liên quan đến bàn phím
Khi thao tác nhấn phím được thực
hiện thì Windows phát sinh thông
điệp WM_KEYDOWN.
Khi nhả phím thì Windows sẽ phát
sinh thông điệp WM_KEYUP
• Trong đó, tham số wParam sẽ nhận giá trị
mã phím ảo, và tham số lParam chứa
thông tin chi tiết về phím được gõ vào
Mai Xuân Hùng
3
Các mã phím ảo cần nhớ
VK_DOWN : Mã phím mũi tên đi xuống
VK_UP: Mã phím mũi tên đi lên
VK_LEFT: Mã phím mũi tên qua trái
VK_RIGHT: Mã phím mũi tên qua phải
VK_ADD: Mã phím cộng
VK_SUBTRACT: Mã phím trừ
Mai Xuân Hùng
4
Ví dụ 1
Ví dụ 1: Xuất ký tự A ra màn hình, sau
đó dùng phím mũi tên đi lên, đi xuống và
qua lại để di chuyển ký tự A ở trên. Biết
rằng 1 bước dịch chuyển là 3 pixel. Lần
xuất đầu tiên ký tự nằm giữa cử sổ
chính
Mai Xuân Hùng
5
Giao diện chương trình
Mai Xuân Hùng
6
Coding
Khai báo trong hàm WndProc
• static int x,y;
• TCHAR str[2];
Mai Xuân Hùng
7
Coding (tt)
//xác định vị trí giữa màn hình
case WM_SIZE:
x=LOWORD(lParam)/2;
y=HIWORD(lParam)/2;
break;
Mai Xuân Hùng
8
Coding (tt)
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
strcpy(str,"A");
TextOut(hdc,x,y,str,1);
EndPaint(hWnd, &ps);
break;
Mai Xuân Hùng
9
Coding (tt)
case WM_KEYDOWN:
switch(wParam)
{
case VK_DOWN:
y+=3;
InvalidateRect(hWnd,NULL,TRUE);
break;
case VK_UP:
y-=3;
InvalidateRect(hWnd,NULL,TRUE);
break;
Mai Xuân Hùng
10
Coding (tt)
case VK_LEFT:
x-=3;
InvalidateRect(hWnd,NULL,TRUE);
break;
case VK_RIGHT:
x+=3;
InvalidateRect(hWnd,NULL,TRUE);
break;
}
break;
Mai Xuân Hùng
11
Ví dụ 2
Vẽ 1 hình tròn bán kính 5 pixel ra màn
hình sau đó dung phím +,- để phóng to và
thu nhỏ hình tròn trên. Biết rằng kích
thước R mỗi lần tăng hoặc giảm đi 3 pixel
Mai Xuân Hùng
12
Giao diện chương trình
Mai Xuân Hùng
13
Coding
Khai báo trong hàm WndProc
• static int R;
• static int x,y;
Mai Xuân Hùng
14
Coding (tt)
case WM_CREATE:
R=50;
break;
case WM_SIZE:
x=LOWORD(lParam)/2;
y=HIWORD(lParam)/2;
break;
Mai Xuân Hùng
15
Coding (tt)
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
Ellipse(hdc,x-R,y-R,x+R,y+R);
EndPaint(hWnd, &ps);
break;
Mai Xuân Hùng
16
Lập trình xử lý thông điệp
case WM_KEYDOWN:
switch(wParam)
{
case VK_ADD:
R+=3;
InvalidateRect(hWnd,NULL,TRUE);
break;
case VK_SUBTRACT:
R-=3;
InvalidateRect(hWnd,NULL,TRUE);
break;
}
break;
Mai Xuân Hùng
17
Thông điệp liên quan đến chuột
WM_MOUSEMOVE: Phát sinh khi dịch chuyển
chuột trong vùng làm việc
Mai Xuân Hùng
18
Thông điệp liên quan đến chuột
Khi người dùng click chuột, tuỳ theo cách thao tác mà
chúng ta có các thông điệp sau:
Nút
Nhấn
Thả
Nhấn đúp
Trái
WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
Giữa
WM_MBUTTONDOWN
WM_MBUTTONUP
WM_MBUTTONDBLCLK
Phải
WM_RBUTTONDOWN
WM_MBUTTONUP
WM_RBUTTONDBLCLK
Mai Xuân Hùng
19
Các bước tạo ứng dụng
Để nhận được thông điệp kích đôi thiết
bị chuột thủ tục MyRegisterClass cửa sổ
phải khai báo nhận thông điệp này như
sau:
wcex.style = CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
Mai Xuân Hùng
20
Các thông số đi kèm
(LOWORD)lParam cho biết ví trí x của
chuột.
(HIWORD)lParam cho biết vị trí y của
chuột.
wParam: cho biết trạng thái của nút
nhấn, các trạng thái của nút nhấn như
sau:
Mai Xuân Hùng
21
Trạng thái của nút nhấn trên chuột
MK_LBUTTON
Nút chuột trái được nhấn
MK_MBUTTON
Nút chuột giữa nhấn
MK_RBUTTON
Nút chuột phảI nhấn
MK_SHIFT
Phím shift được nhấn
MK_CONTROL
Phím Control được nhấn
Mai Xuân Hùng
22
Ví dụ 1
In ví trí của chuột lên thanh tiêu đề của chương
trình khi chúng ta di chuyển chuột trên cửa sổ làm
việc.
Mai Xuân Hùng
23
Coding
Khai báo trong hàm WndProc
char str[100];
int x,y;
Viết lệnh trong thông điệp WM_MOUSEMOVE
case WM_MOUSEMOVE:
x=LOWORD(lParam);
y=HIWORD(lParam);
sprintf(str,"x=%d,y=%d",x,y);
SetWindowText(hWnd,str);
break;
Mai Xuân Hùng
24
Ví dụ 2
Vẽ hình tròn bán kính 50 pixel tại vị trí
chuột trái nhấn trên màn hình. Ví trí đầu
tiên hiển thị là giữa màn hình
Mai Xuân Hùng
25