More than Just Lines on a Map: Best Practices for U.S Bike Routes
Cfw vidu baitap
1. 1
Lập trình C trên Windows
Ví dụ và Bài tập
Nguyễn Đức Hoàng Hạ
Khoa CNTT – Trường ĐHKHTN
Email: ndhha@fit.hcmuns.edu.vn
2. 2
WinMain
• int WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
//1. hInstanceàĐăng ký loại cửa sổ mới
//2. Tạo một cửa sổàhWnd
//3. Thực hiện vòng lập nhận và gửi xử lý thông điệp
return 0;
}
11. 11
MOUSE
• WM_LBUTTONDOWN - WM_LBUTTONUP -
WM_LBUTTONDBLCLK
• WM_RBUTTONDOWN - WM_RBUTTONUP -
WM_RBUTTONDBLCLK
• WM_MOUSEMOVE
• wParam: ghi nhận các phím đặc biệt
– MK_CONTROL
– MK_SHIFT
– MK_LBUTTON, MK_RBUTTON, MK_MBUTTON
• lParam:
– x = LOWORD(lParam)
– Y = HIWORD(lParam)
12. 12
Ví dụ 1
Dùng chuột vẽ đoạn thẳng
• Mô tả bài toán:
– Nhấn chuột trái chọn điểm đầu
– Nhấn chuột phải chọn điểm cuối
– Khi có thay đổi thì vẽ lại ra màn hình
• Yêu cầu:
– Thiết kế dữ liệu
– Viết mã giả xử lý cho các sự kiện sau:
• WM_CREATE
• WM_PAINT
• WM_LBUTTONDOWN
• WM_RBUTTONDOWN
14. 14
Bài tập 1
• Mô tả bài toán:
– Nhấn chuột trái chọn điểm đầu
– Thả chuột trái chọn điểm cuối
– Khi có thay đổi thì vẽ lại ra màn hình
• Yêu cầu:
– Thiết kế dữ liệu
– Viết mã giả xử lý cho các sự kiện sau:
• WM_CREATE, WM_PAINT
• WM_LBUTTONDOWN, WM_LBUTTONUP
• WM_MOUSEMOVE
15. 15
TIMER
• UINT_PTR SetTimer(HWND hWnd,
UINT_PTR nID,
UINT uElapse, //số nhịp
TIMERPROC lpTimerFunc );
• WM_TIMER: wParam == nID
• 1 giây = 1000 nhịp
• Ví dụ: SetTimer(hWnd, 1, 500, NULL);
• Khi không dùng nữa thì dùng lệnh KillTimer để hủy:
KillTimer(hWnd, nID)
• Thường lệnh SetTimer được đặt trong sự kiện
WM_CREATE và KillTimer đặt trong sự kiện
WM_DESTROY
16. 16
Ví dụ 2
Mô phỏng banh rơi
• Mô tả bài toán:
– Một quả banh rơi tự do từ độ cao H xuống nền rồi
dội lên lại độ cao H.
• Yêu cầu:
– Thiết kế dữ liệu
– Viết mã giả xử lý cho các sự kiện sau:
• WM_CREATE, WM_DESTROY
• WM_PAINT
• WM_TIMER
17. 17
Ví dụ 2
• Dữ liệu:
double h; //độ cao hiện tại
double a = -5;//gia tốc
double v, //vận tốc hiện tại
double H=300; //độ cao tối đa
int r=5; //bán kính
int T = 50;//số nhịp dùng để đặt trong SetTimer
• WM_PAINT
x = 100; y = H+100-h; //đảo hệ tọa độ
Ellipse(hdc,x-r,y-r, x+r,y+r);
MoveToEx(hdc,0,H+100,NULL);
LineTo(hdc,300,H+100);
18. 18
Ví dụ 2
case WM_TIMER:
t = T / 1000.0;
h = a*t*t + v*t + h;
v = a*t + v;
if (h<0) {
h = 0;
v = -v;
}
InvalidateRect(hWnd,NULL,TRUE);
break;
19. 19
Ví dụ 2
case WM_CREATE:
v = 0;//vận tốc ban đầu
h = H;//độ cao ban đầu
SetTimer(hWnd,1,T,NULL);
break;
case WM_DESTROY:
KillTimer(hWnd,1);
PostQuitMessage(0);
break;
20. 20
• Mô tả bài toán:
Bài tập 2
V
H
• Yêu cầu:
L
– Thiết kế dữ liệu
– Viết mã giả xử lý cho các sự kiện sau:
• WM_CREATE , WM_DESTROY
• WM_PAINT
• WM_TIMER
21. 21
Ví dụ 3
Máy tính bỏ túi
• Mô tả bài toán:
– Nhấn các nút bằng chuột để nhập
– Cho phép nhấn phím số trên bàn phím
• Yêu cầu:
– Thiết kế dữ liệu
– Viết mã giả xử lý cho các sự kiện:
• WM_INITDIALOG
• WM_COMMAND
• WM_CHAR
22. 22
Ví dụ 3
case WM_COMMAND:
switch(LOWORD(wParam)) {
case ID_BTN1:
//Xử lý nhấn nút 1
break;
case ID_BTN2:
//Xử lý nhấn nút 2
break;
}
return 1;
24. 24
Debug
• Chạy từng lệnh : F10
• Chạy vào trong lệnh: F11
• Đặt điểm dừng: F9
• Chay chương trình ở chế độ debug: F5
• Chạy chương trình không ở chế độ debug:
Ctrl+F5
• Muốn debug ở sự kiện nào thì phải đặt điểm
dừng ở sự kiện đó. Không thể chạy từng lệnh
(F10, F11) tới vị trí đó được.