Download - Cfw vidu baitap
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]
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
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);
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
5
DialogBoxint 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ụ 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
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ị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
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
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);
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;
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;
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ụ 3Máy tính bỏ túi
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;
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ì?