Bài 5Bàn phím, chuột và bộ định thời gian... 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í
Trang 1Bài 5
Bàn phím, chuột và bộ định
thời gian
Trang 2Bài 5
Bàn phím, chuột và bộ định
thời gian
Trang 3Nhữ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
Trang 4Cá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
Trang 5Ví 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
Trang 6Giao diện chương trình
Trang 7 Khai báo trong hàm WndProc
• static int x,y;
• TCHAR str[2];
Trang 10Coding (tt)
case WM_KEYDOWN:
switch (wParam) { case VK_DOWN:
Trang 11break;
Trang 12Ví 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
Trang 13Giao diện chương trình
Trang 16Coding (tt)
case WM_PAINT:
hdc = BeginPaint (hWnd, &ps); Ellipse (hdc,x-R,y-R,x+R,y+R); EndPaint (hWnd, &ps);
break ;
Trang 17Lập trình xử lý thông điệp
case WM_KEYDOWN:
switch (wParam) {
Trang 18Thô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
Trang 19Thô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
Trang 20Cá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:
Trang 21 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:
Trang 22Trạ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
Trang 23Ví 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.
Trang 25Ví 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
Trang 26 Khai báo
static int x,y;
Viết lệnh trong thông điệp WM_SIZE
case WM_SIZE:
x=LOWORD(lParam)/2;
y=HIWORD(lParam)/2;
Trang 28Ví dụ 3
Vẽ đường thẳng từ vị trí Click chuột trái ban đầu đến vị trí Click chuột trái cuối
Trang 29 Khai báo biến trong hàm WndProc
static POINT pFrom, pTo;
static int flag;
Viết lệnh trong WM_CREATE
case WM_CREATE:
flag=0;
break ;
Trang 30Coding (tt)
case WM_LBUTTONDOWN:
if (flag==0) {
Trang 31Ví dụ 4
Vẽ nét liền khi nhấn và rê chuột trái trong vùng làm việc
Trang 33Coding (tt)
case WM_MOUSEMOVE:
hdc=GetDC(hWnd);
if ((wParam&MK_LBUTTON)==MK_LBUTTON) {
pTo.x=LOWORD(lParam);
pTo.y=HIWORD(lParam);
MoveToEx(hdc,pFrom.x,pFrom.y,NULL); LineTo(hdc,pTo.x,pTo.y);
pFrom=pTo;
} ReleaseDC(hWnd,hdc);
Trang 34Bộ định thời gian
Kích hoạt bộ định thời gian :
UINT_PTR SetTimer(HWND hWnd, UINT_PTR
nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc);
• uElapse (phần nghìn giây): Xác lập thời gian mà Windows
se phát sinh thông điệp WM_TIMER.
• nIDEvent : định danh của bộ định thời gian.
• lpTimerFunc trỏ đến hàm sẽ xử lý khi thông điệp
WM_TIMER phát sinh Nếu giá trị này là NULL thì Windows
sẽ gởi thông điệp WM_TIMER vào hàng đợi thông điệp của
cửa sổ tương ứng.
Hủy bộ định thời gian
Trang 35Ví dụ
Viết chương trình xuất ra màn hình đồng
hồ điện tử gồm có giờ :phút:giây ra màn hình
Trang 38Ví dụ 2
Viết chương trình hiển thị vòng tròn có R=50 nằm giữ màn hình Cứ 1 giây R tăng lên 1 pixel, khi chặm biên thì giảm
R, và khi bằng R ban đầu thì tăng R lên lại
Trang 39 Khai báo biến trong hàm WndProc
static int R,x,y,chieu;
Trang 40Coding (tt)
case WM_TIMER:
if (chieu==1) {