cfw vidu baitap
DESCRIPTION
lập trình cTRANSCRIPT
![Page 1: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/1.jpg)
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: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/2.jpg)
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: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/3.jpg)
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: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/4.jpg)
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: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/5.jpg)
5
DialogBoxint APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{DialogBox(hInstance,
LPCTSTR(IDD_DIALOG1),NULL,DLGPROC(dlgProc) );
return 0;}
![Page 6: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/6.jpg)
6
Resource
![Page 7: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/7.jpg)
7
Resource
![Page 8: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/8.jpg)
8
Resource
![Page 9: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/9.jpg)
9
Resource
![Page 10: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/10.jpg)
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: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/11.jpg)
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: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/12.jpg)
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: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/13.jpg)
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: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/14.jpg)
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: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/15.jpg)
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: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/16.jpg)
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: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/17.jpg)
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: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/18.jpg)
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: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/19.jpg)
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: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/20.jpg)
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: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/21.jpg)
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: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/22.jpg)
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: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/23.jpg)
23
Bài tập 3• Thêm phím âm dương vào ví dụ 3
![Page 24: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/24.jpg)
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: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/25.jpg)
25
MSDN
![Page 26: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/26.jpg)
26
![Page 27: Cfw vidu baitap](https://reader033.vdocuments.site/reader033/viewer/2022052508/5596dd361a28abd56a8b4815/html5/thumbnails/27.jpg)
27
MFC là gì?