Tải bản đầy đủ (.pdf) (27 trang)

Tài liệu Lập trình C trên Windows - Ví dụ và Bài tập pptx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (619.94 KB, 27 trang )

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:
2
WinMain
•intWinMain(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;
}
3
RegisterClassEx
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_BBBBB);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName= (LPCSTR)IDC_BBBBB;


wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(hInstance,(LPCTSTR)IDI_SMALL);
RegisterClassEx(&wcex);
4
CreateWindow
• hWnd = CreateWindow(szWindowClass, szTitle,
WS_OVERLAPPEDWINDOW,
100, 200, //trái -trên
500, 300, //rộng -cao
NULL, // cửa sổ cha
NULL, // menu
hInstance,
NULL );
• WS_OVERLAPPEDWINDOW = WS_OVERLAPPED |
WS_CAPTION | WS_SYSMENU | WS_THICKFRAME |
WS_MINIMIZEBOX | WS_MAXIMIZEBOX
5
DialogBox
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
DialogBox(hInstance,
LPCTSTR(IDD_DIALOG1),
NULL,
DLGPROC(dlgProc) );
return 0;
}
6

Resource
7
Resource
8
Resource
9
Resource
10
WndProc-DlgProc
•LRESULT CALLBACK WndProc(
HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam);
•INT_PTR CALLBACK dlgProc(
HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
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
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
13
Ví dụ 1
• Dữ liệu:
POINT P1, P2;
• WM_CREATE:
P1.x = P1.y = 0; P2.x = P2.y = 0;
• WM_LBUTTONDOWN:
P1.x = LOWORD(lParam); P1.y = HIWORD(lParam);
• WM_RBUTTONDOWN:
P2.x = LOWORD(lParam); P2.y = HIWORD(lParam);
InvalidateRect(hWnd, NULL,TRUE); //Vẽ lại màn hình
• WM_PAINT:

MoveTo(hdc,P1.x, P1.y);
LineTo(hdc,P2.x, P2.y);
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
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
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
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
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
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
•Mô tả bài toán:
•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
Bài tập 2
H
V
L

21
•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
Ví d
ụ 3
Máy tính bỏ túi
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;
23
Bài tập 3
•Thêm phím âm dương vào ví dụ 3
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.
25
MSDN

×