27
1 Lp trình C trên Windows Ví dvà Bài tp Nguyn Đức Hoàng HKhoa CNTT – Trường ĐHKHTN Email: [email protected]

Lập Trình C Trên Windows Ví dụ

Embed Size (px)

Citation preview

Page 1: Lập Trình C Trên Windows Ví dụ

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 ĐHKHTNEmail: [email protected]

Page 2: Lập Trình C Trên Windows Ví dụ

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;}

Page 3: Lập Trình C Trên Windows Ví dụ

3

RegisterClassExWNDCLASSEX 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);

Page 4: Lập Trình C Trên Windows Ví dụ

4

CreateWindow• hWnd = CreateWindow( szWindowClass, szTitle,

WS_OVERLAPPEDWINDOW,100, 200, //trái - trên500, 300, //rộng - caoNULL, // cửa sổ chaNULL, // menuhInstance, NULL );

• WS_OVERLAPPEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX

Page 5: Lập Trình C Trên Windows Ví dụ

5

DialogBoxint APIENTRY WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)

{DialogBox(hInstance,

LPCTSTR(IDD_DIALOG1),NULL,DLGPROC(dlgProc) );

return 0;}

Page 6: Lập Trình C Trên Windows Ví dụ

6

Resource

Page 7: Lập Trình C Trên Windows Ví dụ

7

Resource

Page 8: Lập Trình C Trên Windows Ví dụ

8

Resource

Page 9: Lập Trình C Trên Windows Ví dụ

9

Resource

Page 10: Lập Trình C Trên Windows Ví dụ

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);

Page 11: Lập Trình C Trên Windows Ví dụ

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)

Page 12: Lập Trình C Trên Windows Ví dụ

12

Ví dụ 1Dù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

Page 13: Lập Trình C Trên Windows Ví dụ

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);

Page 14: Lập Trình C Trên Windows Ví dụ

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

Page 15: Lập Trình C Trên Windows Ví dụ

15

TIMER• UINT_PTR SetTimer(HWND hWnd,

UINT_PTR nID,UINT uElapse, //số nhịpTIMERPROC 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

Page 16: Lập Trình C Trên Windows Ví dụ

16

Ví dụ 2Mô 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

Page 17: Lập Trình C Trên Windows Ví dụ

17

Ví dụ 2• Dữ liệu:

double h; //độ cao hiện tạidouble a = -5;//gia tốcdouble v, //vận tốc hiện tạidouble H=300; //độ cao tối đaint r=5; //bán kínhint T = 50;//số nhịp dùng để đặt trong SetTimer

• WM_PAINTx = 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);

Page 18: Lập Trình C Trên Windows Ví dụ

18

Ví dụ 2case 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;

Page 19: Lập Trình C Trên Windows Ví dụ

19

Ví dụ 2case WM_CREATE:

v = 0;//vận tốc ban đầuh = H;//độ cao ban đầuSetTimer(hWnd,1,T,NULL);break;

case WM_DESTROY:KillTimer(hWnd,1);PostQuitMessage(0);break;

Page 20: Lập Trình C Trên Windows Ví dụ

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

Page 21: Lập Trình C Trên Windows Ví dụ

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ụ 3Máy tính bỏ túi

Page 22: Lập Trình C Trên Windows Ví dụ

22

Ví dụ 3case WM_COMMAND:

switch(LOWORD(wParam)) {case ID_BTN1:

//Xử lý nhấn nút 1break;

case ID_BTN2://Xử lý nhấn nút 2break;

}return 1;

Page 23: Lập Trình C Trên Windows Ví dụ

23

Bài tập 3• Thêm phím âm dương vào ví dụ 3

Page 24: Lập Trình C Trên Windows Ví dụ

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.

Page 25: Lập Trình C Trên Windows Ví dụ

25

MSDN

Page 26: Lập Trình C Trên Windows Ví dụ

26

Page 27: Lập Trình C Trên Windows Ví dụ

27

MFC là gì?