Bài giảng Lập trình C trên Windows: Ví dụ và bài tập - Nguyễn Đức Hoàng Hạ

int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { //1. hInstanceàăngký 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; }

pdf27 trang | Chia sẻ: haohao89 | Lượt xem: 2162 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Bài giảng Lập trình C trên Windows: Ví dụ và bài tập - Nguyễn Đức Hoàng Hạ, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
1Lậ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 2WinMain • 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; } 3RegisterClassEx 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); 4CreateWindow • 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 5DialogBox int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { DialogBox(hInstance, LPCTSTR(IDD_DIALOG1), NULL, DLGPROC(dlgProc) ); return 0; } 6Resource 7Resource 8Resource 9Resource 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ì?