SlideShare a Scribd company logo
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
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;
}
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
26
27
MFC là gì?

More Related Content

What's hot

Code thực hành tin học đại cương. ctgttp
Code thực hành tin học đại cương. ctgttpCode thực hành tin học đại cương. ctgttp
Code thực hành tin học đại cương. ctgttp
Ttx Love
 
Bài 18. Ví dụ về cách viết và sử dụng chương trình con.
Bài 18. Ví dụ về cách viết và sử dụng chương trình con.Bài 18. Ví dụ về cách viết và sử dụng chương trình con.
Bài 18. Ví dụ về cách viết và sử dụng chương trình con.
Sân Ngoài Còn Lá
 
Lap trinh c++ có lời giải 3
Lap trinh c++ có lời giải 3Lap trinh c++ có lời giải 3
Lap trinh c++ có lời giải 3Minh Ngoc Tran
 
giao trinh c++ Chuong1
giao trinh c++ Chuong1giao trinh c++ Chuong1
giao trinh c++ Chuong1Bễ Nguyễn
 

What's hot (7)

Code thực hành tin học đại cương. ctgttp
Code thực hành tin học đại cương. ctgttpCode thực hành tin học đại cương. ctgttp
Code thực hành tin học đại cương. ctgttp
 
Bài 18. Ví dụ về cách viết và sử dụng chương trình con.
Bài 18. Ví dụ về cách viết và sử dụng chương trình con.Bài 18. Ví dụ về cách viết và sử dụng chương trình con.
Bài 18. Ví dụ về cách viết và sử dụng chương trình con.
 
Tut6 solution
Tut6 solutionTut6 solution
Tut6 solution
 
Ktlt lab full
Ktlt lab fullKtlt lab full
Ktlt lab full
 
Bai de quy
Bai de quyBai de quy
Bai de quy
 
Lap trinh c++ có lời giải 3
Lap trinh c++ có lời giải 3Lap trinh c++ có lời giải 3
Lap trinh c++ có lời giải 3
 
giao trinh c++ Chuong1
giao trinh c++ Chuong1giao trinh c++ Chuong1
giao trinh c++ Chuong1
 

Similar to 11 vidu baitap_c

12 vidu baitap_c
12 vidu baitap_c12 vidu baitap_c
12 vidu baitap_cHồ Lợi
 
01 ngon ngu_c#_phan_1
01 ngon ngu_c#_phan_101 ngon ngu_c#_phan_1
01 ngon ngu_c#_phan_1htpsccbb159
 
Powerpoint dạy hoc
Powerpoint dạy hocPowerpoint dạy hoc
Powerpoint dạy hocLong Tibbers
 
C8 object-oriented thinking
C8 object-oriented thinkingC8 object-oriented thinking
C8 object-oriented thinking
Tiến Quang Phan
 
C8 object-oriented thinking
C8 object-oriented thinkingC8 object-oriented thinking
C8 object-oriented thinkingHồ Lợi
 

Similar to 11 vidu baitap_c (6)

12 vidu baitap_c
12 vidu baitap_c12 vidu baitap_c
12 vidu baitap_c
 
01 ngon ngu_c#_phan_1
01 ngon ngu_c#_phan_101 ngon ngu_c#_phan_1
01 ngon ngu_c#_phan_1
 
01 ngon ngu_c#_phan_1
01 ngon ngu_c#_phan_101 ngon ngu_c#_phan_1
01 ngon ngu_c#_phan_1
 
Powerpoint dạy hoc
Powerpoint dạy hocPowerpoint dạy hoc
Powerpoint dạy hoc
 
C8 object-oriented thinking
C8 object-oriented thinkingC8 object-oriented thinking
C8 object-oriented thinking
 
C8 object-oriented thinking
C8 object-oriented thinkingC8 object-oriented thinking
C8 object-oriented thinking
 

More from Hồ Lợi

Tóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của cTóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của cHồ Lợi
 
Lect04 functions
Lect04 functionsLect04 functions
Lect04 functionsHồ Lợi
 
Ky thuatkhudequy
Ky thuatkhudequyKy thuatkhudequy
Ky thuatkhudequyHồ Lợi
 
Itt epc assignment
Itt epc assignmentItt epc assignment
Itt epc assignmentHồ Lợi
 
Huong danontapc
Huong danontapcHuong danontapc
Huong danontapcHồ Lợi
 
H hai epc_baitap
H hai epc_baitapH hai epc_baitap
H hai epc_baitapHồ Lợi
 
Giaotrinhbaitapkythuatlaptrinh
GiaotrinhbaitapkythuatlaptrinhGiaotrinhbaitapkythuatlaptrinh
GiaotrinhbaitapkythuatlaptrinhHồ Lợi
 
Giao trinh ky thuat lap trinh 2
Giao trinh ky thuat lap trinh 2Giao trinh ky thuat lap trinh 2
Giao trinh ky thuat lap trinh 2Hồ Lợi
 
Giao trinh c c++
Giao trinh c c++Giao trinh c c++
Giao trinh c c++Hồ Lợi
 
Epc assignment
Epc assignmentEpc assignment
Epc assignmentHồ Lợi
 
Epc test practical
Epc test practicalEpc test practical
Epc test practicalHồ Lợi
 
De thic++ --th
De thic++ --thDe thic++ --th
De thic++ --thHồ Lợi
 

More from Hồ Lợi (20)

Xu ly chuoi
Xu ly chuoiXu ly chuoi
Xu ly chuoi
 
Tóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của cTóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của c
 
T4
T4T4
T4
 
Nguyen lyoop
Nguyen lyoopNguyen lyoop
Nguyen lyoop
 
Lect04 functions
Lect04 functionsLect04 functions
Lect04 functions
 
Ky thuatkhudequy
Ky thuatkhudequyKy thuatkhudequy
Ky thuatkhudequy
 
Itt epc assignment
Itt epc assignmentItt epc assignment
Itt epc assignment
 
Huong danontapc
Huong danontapcHuong danontapc
Huong danontapc
 
H hai epc_baitap
H hai epc_baitapH hai epc_baitap
H hai epc_baitap
 
Gtrinh oop
Gtrinh oopGtrinh oop
Gtrinh oop
 
Giaotrinhbaitapkythuatlaptrinh
GiaotrinhbaitapkythuatlaptrinhGiaotrinhbaitapkythuatlaptrinh
Giaotrinhbaitapkythuatlaptrinh
 
Giao trinh ky thuat lap trinh 2
Giao trinh ky thuat lap trinh 2Giao trinh ky thuat lap trinh 2
Giao trinh ky thuat lap trinh 2
 
Giao trinh c c++
Giao trinh c c++Giao trinh c c++
Giao trinh c c++
 
File trong c_
File trong c_File trong c_
File trong c_
 
Epc assignment
Epc assignmentEpc assignment
Epc assignment
 
Epc test practical
Epc test practicalEpc test practical
Epc test practical
 
De thic++ --th
De thic++ --thDe thic++ --th
De thic++ --th
 
Dethi c++ -lt
Dethi c++ -ltDethi c++ -lt
Dethi c++ -lt
 
Debug trong c
Debug trong cDebug trong c
Debug trong c
 
D05 stl
D05 stlD05 stl
D05 stl
 

11 vidu baitap_c

  • 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; }
  • 3. 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. 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. 5 DialogBox int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { DialogBox(hInstance, LPCTSTR(IDD_DIALOG1), NULL, DLGPROC(dlgProc) ); return 0; }
  • 10. 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. 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
  • 13. 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. 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: • 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. 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. 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. 23 Bài tập 3 • Thêm phím âm dương vào ví dụ 3
  • 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.
  • 26. 26