Bài giảng Kỹ thuật lập trình Visual C++ (MFC – Microsoft Foundation Classes)

pdf 71 trang phuongnguyen 4340
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Kỹ thuật lập trình Visual C++ (MFC – Microsoft Foundation Classes)", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_ky_thuat_lap_trinh_visual_c_mfc_microsoft_foundati.pdf

Nội dung text: Bài giảng Kỹ thuật lập trình Visual C++ (MFC – Microsoft Foundation Classes)

  1. Đại Học Sư Phạm Tp. Hồ Chí Minh Khoa Toán – Tin Học LẬP TRÌNH WINDOWS KỸ THUẬT LẬP TRÌNH VISUAL C++ (MFC – Microsoft Foundation Classes) ™ Giới thiệu về MFC, Visual C++ 6.0 ™ Các loại ứng dụng trong Visual C++ 6.0 ™ Xử lý chuột, bàn phím ™ MessageBox Trần Ngọc Bảo Email: tnbao.dhsp@gmail.com
  2. NỘI DUNG ™ Giới thiệu về MFC ™ Microsoft Visual C++ 6.0 ™ Các loại ứng dụng trong windows ™ Chương trình MFC đầu tiên ™ Xử lý chuột và bàn phím ™ Message Box
  3. NỘI DUNG ™ Giới thiệu về MFC ™ Microsoft Visual C++ 6.0 ™ Các loại ứng dụng trong windows ™ Chương trình MFC đầu tiên ™ Xử lý chuột và bàn phím ™ Message Box
  4. Giới thiệu về MFC (1/2) ™ MFC – Microsoft Foundation Class ™ MFC là một thư viện các lớp (class, OOP) trong ngôn ngữ Visual C++, được sử dụng để xây dựng các ứng dụng trên Windows ™ MFC được xây dựng trên cơ sở các hàm thư viện API của Windows ™ Trong một ứng dụng MFC, ta sẽ không gọi trực tiếp các hàm Windows API mà sẽ tạo các object từ những lớp của MFC, sau đó gọi các hàm của object này ™ Đa số các hàm của lớp MFC có cùng tên với những hàm Windows API
  5. Giới thiệu về MFC (2/2) ™ MFC tạo ra một Application Framework giúp cho lập trình viên thiết kế kiến trúc của ứng dụng nhất quán và khoa học hơn ™ Thông qua các class trong MFC, người lập trình có thể xây dựng ứng dụng nhanh và ít tốn công sức hơn so với việc sử dụng đơn thuần các hàm thư viện API của Windows ™ Trong MFC ta vẫn có thể gọi các hàm Windows API ™ MFC có nhiều version 1, 2, 3, 6. Version 6.0 có khoảng 200 class
  6. Một số tính năng của MFC (1/4) ™ Version 1: (Visual C++ 1.0) ƒ Các lớp List, Array, String, Time, Date, File access, ƒ Các lớp giao diện cơ bản ƒ MDI, OLE 1.0 ™ Version 2: (Visual C++ 1.0) ƒ File open, save ƒ Print preview, printing ƒ Scrolling window, Spliter window ƒ Tool bar, status bar ƒ Access to Visual Basic controls ƒ Context-sensitive help ƒ An improved interface to OLE version 1.0 ƒ DLL
  7. Một số tính năng của MFC (2/4) ™ Version 2.5: (Visual C++ 1.5) ƒ Hỗ trợ kết nối ODBC (Open Database Connectivity) cho phép truy xuất đến các CSDL Access, FoxPro, SQL Server ƒ OLE 2.01 ™ Version 3: (Visual C++ 1.51) ƒ Hỗ trợ Tab dialog (property sheet) ƒ Docking tool bar ™ Version 3.1: (Visual C++ 2.1) ƒ Hỗ trợ các control chuẩn của Windows 95 ƒ ODBC Level 2 ƒ Các lớp Winsock phục vụ lập trình TCP/IP
  8. Một số tính năng của MFC (3/4) ™ Version 4.0: (Visual C++ 4.0) ƒ Hỗ trợ kết nối DAO (Data Acess Object) ƒ Windows 95 docking control bar ƒ Bổ sung thêm Treeview và RichEdit ƒ Các lớp đồng bộ hóa tiểu trình ƒ OLE control container ™ Version 4.2: (Visual C++ 4.2) ƒ Các lớp WinInet ƒ Các lớp ActiveX document server ƒ Các tính năng mở rộng của ActiveX control ƒ Cải tiến một số tính năng của ODBC
  9. Một số tính năng của MFC (4/4) ™ Version 4.21: (Visual C++ 5.0) ƒ Sửa một số lỗi trong version 4.2 ƒ Redesigned IDE, Developer Studio 97 ƒ Hỗ trợ lập trình COM (Component Object Model) ƒ ™ Version 6.0: (Visual C++ 6.0) ƒ Hỗ trợ Các lớp cho những control chuẩn trong ID 4.0 ƒ Hỗ trợ Dynamic HTML, cho phép tạo lập động các trang HTML ƒ Active Document Containment, cho phép ứng dụng MFC có thể chứa các Active document ƒ OLE DB và ADO
  10. NỘI DUNG ™ Giới thiệu về MFC ™ Microsoft Visual C++ 6.0 ™ Các loại ứng dụng trong windows ™ Chương trình MFC đầu tiên ™ Xử lý chuột và bàn phím ™ Message Box
  11. Các thành phần trong ứng dụng Visual C++ Mã nguồn Tài nguyên
  12. Cửa sổ chính của MS Visual C++ 6.0
  13. Cửa sổ chính của MS Visual C++ 6.0
  14. MS Visual C++ 6.0 – Class View
  15. MS Visual C++ 6.0 – Resource View
  16. MS Visual C++ 6.0 – File View
  17. Cửa sổ Debugger trong MS Visual C++ 6.0
  18. NỘI DUNG ™ Giới thiệu về MFC ™ Microsoft Visual C++ 6.0 ™ Các loại ứng dụng trong windows ™ Chương trình MFC đầu tiên ™ Xử lý chuột và bàn phím ™ Message Box
  19. Các loại ứng dụng (1/2) ™ Win32 Console: ứng dụng 32 bits, với giao diện dạng DOS command line ™ Win32 (SDK): ứng dụng 32 bits, chỉ sử dụng thư viện SDK ™ Win32 DLL: ứng dụng 32 bits, dạng thư viện liên kết động (Dynamic – Linked Library) sử dụng SDK ™ Win32 LIB: ứng dụng 32 bits, dạng thư viện liên kết tĩnh (Static – Linked Library) sử dụng SDK ™ MFC EXE: ứng dụng 32 bits, sử dụng thư viện MFC ™ MFC DLL: ứng dụng 32 bits, dạng thư viện liên kết động (Dynamic – Linked Library) sử dụng MFC
  20. Các loại ứng dụng (2/2)
  21. NỘI DUNG ™ Giới thiệu về MFC ™ Microsoft Visual C++ 6.0 ™ Các loại ứng dụng trong windows ™ Chương trình MFC đầu tiên ™ Xử lý chuột và bàn phím ™ Message Box
  22. Ứng dụng MFC đầu tiên – Hello.h class CMyApp : public CWinApp { public: virtual BOOL InitInstance (); }; class CMainWindow : public CFrameWnd { public: CMainWindow (); protected: afx_msg void OnPaint (); DECLARE_MESSAGE_MAP () };
  23. Ứng dụng MFC đầu tiên – Hello.cpp #include #include "Hello.h" CMyApp myApp; ///////////////////////////////////////////////////////////////////////// // CMyApp member functions BOOL CMyApp::InitInstance () { m_pMainWnd = new CMainWindow; m_pMainWnd->ShowWindow (m_nCmdShow); m_pMainWnd->UpdateWindow (); return TRUE; } /////////////////////////////////////////////////////////////////////////
  24. Ứng dụng MFC đầu tiên – Hello.cpp (tt) // CMainWindow message map and member functions BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd) ON_WM_PAINT () END_MESSAGE_MAP () CMainWindow::CMainWindow () { Create (NULL, _T ("The Hello Application")); } void CMainWindow::OnPaint () { CPaintDC dc (this); CRect rect; GetClientRect (&rect); dc.DrawText (_T ("Hello, MFC"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); }
  25. Kết quả chương trình Hello
  26. Các class của ứng dụng Hello CObject CCmdTarget CWinThread CWnd CWinApp CFrameWnd CMyApp CMainWindow
  27. Các bước thực thi ứng dụng int APIENTRY WinMain(HINSTANCE hInstance,WinMain HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // TODO: Place code here. Đăng ký lớp cửa sổ MSG msg; Tạo lập cửa sổ MyRegisterClass(hInstance); // Perform application initialization: Hiển thị cửa sổ if (!InitInstance (hInstance, nCmdShow)) Message Loop { return FALSE; } // Main message loop: while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }
  28. Đăng ký lớp cửa sổ WinMain CMyApp BOOL CMyApp::InitInstance () Đăng ký lớp cửa sổ { Tạo lập cửa sổ m_pMainWnd = new CMainWindow; Hiển thị cửa sổ m_pMainWnd->ShowWindow (m_nCmdShow); Message Loop m_pMainWnd->UpdateWindow (); return TRUE; ATOM MyRegisterClass(HINSTANCE hInstance) { } 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_BAI02); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = (LPCSTR)IDC_BAI02; wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); return RegisterClassEx(&wcex); }
  29. Tạo lập cửa sổ WinMain CMainWindow Đăng ký lớp cửa sổ CMainWindow::CMainWindow () { Tạo lập cửa sổ Create (NULL, _T ("The Hello Application")); Hiển thị cửa sổ } Message Loop BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; // Store instance handle in our global variable hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; }
  30. Hàm tạo lập cửa sổ CMainWindow CMainWindow::CMainWindow () { Create (NULL, _T ("The Hello Application")); } BOOL Create (LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle = WS_OVERLAPPEDWINDOW, const RECT& rect = rectDefault, CWnd* pParentWnd = NULL, LPCTSTR lpszMenuName = NULL, DWORD dwExStyle = 0, CCreateContext* pContext = NULL)
  31. Các tham số trong hàm tạo lập cửa sổ Thuộc tính Ý nghĩa lpszClassName Tên lớp cửa sổ lpszWindowName Tiêu đồ cửa sổ dwStyle Kiểu dáng cửa sổ rect Kích thước và vị trí ban đầu của cửa sổ pParentWnd Cửa sổ cha, NULL cửa sổ không có cửa sổ cha Thực đơn liên quan đến cửa sổ, NULL nghĩa làcửa sổ không có lpszMenuName Menu dwExStyle Kiểu mở rộng của cửa sổ pContext Sử dụng trong ứng dụng Documents/Views
  32. Các kiểu dáng chuẩn của cửa sổ KiểuÝ nghĩa WS_BORDER Tạo cửa sổ với khung mỏng WS_CAPTION Tạo cửa sổ với thanh tiêu đề Tạo cửa sổ con, sử dụng để tạo điều khiển như phím và các cửa WS_CHILD sổ con MDI WS_OVERAPPEP Lập cửa sổ maximize và không có cửa sổ cha WS_OVERAPPEPWI Lập cửa sổ với các kiểu: WS_OVERLAPPED, WS_CAPTION, NDOW WS_SYSMENU, WS_MAXIMIZEBOX, WS_MINIMIZEBOX, Cửa sổ sẽ bị vô hiệu lực WS_DISABLED WS_DLGFRAME Cửa sổ có viền như dialog WS_MAXIMIZE Cử sổ có Maximize WS_MAXIMIZBOX Cửa sổ có nút maximize trên thanh tiêu đề WS_HSCROLL Cửa sổ có thanh trượt ngang WS_VSCROLL Cửa sổ có thanh trượt dọc
  33. Hiển thị cửa sổ WinMain CMainWindow BOOL CMyApp::InitInstance () Đăng ký lớp cửa sổ { Tạo lập cửa sổ m_pMainWnd = new CMainWindow; Hiển thị cửa sổ m_pMainWnd->ShowWindow (m_nCmdShow); Message Loop m_pMainWnd->UpdateWindow (); return TRUE; BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { } HWND hWnd; hInst = hInstance; // Store instance handle in our global variable hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; }
  34. Vòng lặp và xử lý thông điệp WinMain CMainWindow while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessageĐăng ký l ớ(&msg);p cửa sổ Tiếp nhận và xử lý DispatchMessageTạo lập (&msg); cửa sổ } Hiển thị cửa sổ thông điệp như LRESULT CALLBACK WndProcMessage (HWND hwnd Loop, UINT message, WPARAM wParam, thế nào ? LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; switch (message) { case WM_PAINT: hdc = BeginPaint (hwnd, &ps); Ellipse (hdc, 0, 0, 200, 100); EndPaint (hwnd, &ps); return 0; case WM_DESTROY: PostQuitMessage (0); Message Map return 0; } return DefWindowProc (hwnd, message, wParam, lParam); }
  35. Message Map – Ánh xạ thông điệp ™ Ánh xạ thông điệp là bảng tương quan giữa thông điệp và các hàm thành phần quản lý các thông điệp đó ™ Bất kỳ lớp nào suy diễn từ CCmdTarget đều có thể chứa ánh xạ thông điệp ™ Ánh xạ thông điệp được khai báo như các thành phần lớp khác trong khai báo lớp class CMainWindow : public CFrameWnd { public: CMainWindow (); protected: afx_msg void OnPaint (); DECLARE_MESSAGE_MAP () };
  36. Message Map (tt) ™ Mỗi message sẽ được xử lý bởi 1 hàm thành phần tương ứng ™ Những thông điệp với tiền tố WM_XYZ sẽ được cài đặt tương ứng với hàm theo qui tắc ƒ WM_ được chuyển thành On ƒ XYZ được chuyển thành chữ thường trừ ký tự đầu ™ Ví dụ: ƒ WM_PAINT sẽ được chuyển thành OnPaint ƒ WM_MOUSEMOVE sẽ được chuyển thành OnMouseMove ƒ WM_LBUTTONDOWN sẽ được chuyển thành OnLButtonDown
  37. Message Map (tt) ™ Khai báo Message Map class CMainWindow : public CFrameWnd { public: CMainWindow (); protected: afx_msg void OnPaint (); afx_msg void OnLButtonDown(UINT, CPoint); DECLARE_MESSAGE_MAP () }; ™ Cài đặt xử lý Message BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd) ON_WM_PAINT () ON_WM_LBUTTONDOWN() END_MESSAGE_MAP () Void CMainWindow::OnPaint() { } Void CMainWindow::OnLButtonDown(UINT nFlags, CPoint point) { }
  38. Thông điệp WM_XXX và hàm MFC tương ứng Message Afx function WM_CHAR afx_msg void OnChar(UINT,UINT,UINT) WM_CREATE afx_msg int OnCreate(LPCREATESTRUCT) WM_DESTROY afx_msg void OnDestroy() WM_LBUTTONDOWN afx_msg void OnLButtonDown(UINT, CPoint) WM_LBUTTONUP afx_msg void OnLButtonUp(UINT, CPoint) afx_msg void OnMouseMove(UINT, CPoint) WM_MOUSEMOVE WM_RBUTTONDOWN afx_msg void OnRButtonDown(UINT, CPoint) WM_RBUTTONUP afx_msg void OnRButtonUp(UINT, CPoint) WM_SIZE afx_msg void OnSize() WM_PAINT afx_msg void OnPaint()
  39. Xử lý thông điệp cửa sổ - Message Map
  40. Tạo ứng dụng MFC bằng AppWizard ™ Chọn menu File Æ New ™ Chọn Tab Projects ™ Chọn loại project “MFC AppWizard (exe)” ™ Đặt tên project trong ô “Project name” ™ Xác định đường dẫn thư mục trong “Location” ™ Step 1: Chọn loại ứng dụng “Single Document”, bỏ option “Document/View architecture support” ™ Nhấn “Next” đến “Step 4 of 6”
  41. Tạo ứng dụng MFC bằng AppWizard Chọn loại project “MFC AppWizard (EXE)”
  42. Tạo ứng dụng MFC bằng AppWizard Chọn option “Single document”
  43. Tạo ứng dụng MFC bằng AppWizard Chọn option “None”
  44. Tạo ứng dụng MFC bằng AppWizard
  45. Tạo ứng dụng MFC bằng AppWizard
  46. Tạo ứng dụng MFC bằng AppWizard
  47. Tạo ứng dụng MFC bằng AppWizard
  48. Ứng dụng MFC đầu tiên – File view
  49. Ứng dụng MFC đầu tiên – Resource view
  50. Ứng dụng MFC đầu tiên – Class view
  51. Ứng dụng MFC đầu tiên – kết quả chương trình
  52. NỘI DUNG ™ Giới thiệu về MFC ™ Microsoft Visual C++ 6.0 ™ Các loại ứng dụng trong windows ™ Chương trình MFC đầu tiên ™ Xử lý chuột và bàn phím ™ Message Box
  53. Xử lý thông điệp chuột Message Afx function WM_LBUTTONDOWN afx_msg void OnLButtonDown(UINT, CPoint) WM_LBUTTONUP afx_msg void OnLButtonUp(UINT, CPoint) afx_msg void OnLButtonDblClk(UINT, CPoint) WM_LBUTTONBLCLK WM_RBUTTONDOWN afx_msg void OnRButtonDown(UINT, CPoint) WM_RBUTTONUP afx_msg void OnRButtonUp(UINT, CPoint) WM_RBUTTONBLCLK afx_msg void OnRButtonDblClk(UINT, CPoint) WM_MOUSEMOVE afx_msg void OnMouseMove(UINT, CPoint)
  54. Message Map và ClassWizard
  55. Hàm xử lý thông điệp chuột tương ứng
  56. Hàm xử lý thông điệp chuột tương ứng
  57. Hàm xử lý thông điệp chuột tương ứng
  58. Hàm xử lý thông điệp chuột tương ứng void CMouseView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CView::OnLButtonDown(nFlags, point); } void CMouseView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CView::OnLButtonUp(nFlags, point); } void CMouseView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CView::OnMouseMove(nFlags, point); }
  59. Hàm xử lý thông điệp chuột tương ứng void CMouseView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default m_nStartX = point.x; m_nStartY = point.y; CView::OnLButtonDown(nFlags, point); } void CMouseView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CClientDC dc(this); dc.MoveTo(m_nStartX,m_nStartY); dc.LineTo(point.x,point.y); CView::OnLButtonUp(nFlags, point); }
  60. Kết quả xử lý thông điệp chuột
  61. Hàm xử lý thông điệp chuột tương ứng void CMouseView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default m_nStartX = point.x; m_nStartY = point.y; CView::OnLButtonDown(nFlags, point); } void CMouseView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CClientDC dc(this); dc.MoveTo(m_nStartX,m_nStartY); dc.LineTo(point.x,point.y); CView::OnLButtonUp(nFlags, point); }
  62. Kết quả xử lý thông điệp chuột
  63. NỘI DUNG ™ Giới thiệu về MFC ™ Microsoft Visual C++ 6.0 ™ Các loại ứng dụng trong windows ™ Chương trình MFC đầu tiên ™ Xử lý chuột và bàn phím ™ Message Box
  64. Message Box - Hộp thông báo ™ Hộp thông báo được sử dụng để thông báo, trao đổi giữa ứng dụng với người dùng ™ Để tạo lập hộp thông báo, ta sử dụng hàm MessageBox Cwnd::int MessageBox (LPCTSTR lpszText, LPCTSTR lpszCaption = NULL, UINT nType = MB_OK)
  65. Các kiểu hộp thông báo và giá trị trả về tương ứng Type Buttons Possible Return Codes MB_ABORTRETRYIGNORE Abort, Retry, IDABORT, IDRETRY, Ignore IDIGNORE MB_OK OK IDOK MB_OKCANCEL OK, Cancel IDOK, IDCANCEL MB_RETRYCANCEL Retry, Cancel IDRETRY, IDCANCEL MB_YESNO Yes, No IDYES, IDNO MB_YESNOCANCEL Yes, No, IDYES, IDNO, IDCANCEL Cancel
  66. Message Box - Hộp thông báo ™ Để tạo lập hộp thông báo trên ta sử dụng hàm MessageBox như sau: int nRes = MessageBox (“The file ‘Database Tip.doc’ is a read-only file. Are you sure you want to move it to the Recycle Bin ?”, “Confirm File Delete”, MB_YESNO) ™ Chọn “Yes” Æ nRes =IDYES ™ Chọn “No” Æ nRes = IDNO
  67. Message Box - Hộp thông báo ™ Để tạo lập hộp thông báo trên ta sử dụng hàm MessageBox như sau: int nRes = MessageBox (“Do you want to save the changes to Document1 ?”, “Microsoft Office Word”, MB_YESNOCANCEL) ™ Chọn “Yes” Æ nRes =IDYES ™ Chọn “No” Æ nRes = IDNO ™ Chọn “Cancel” Æ nRes = IDCANCEL
  68. Các kiểu biểu tượng trong hộp thông báo MB_ICONQUESTION MB_ICONINFORMATION MB_ICONSTOP MB_ICONEXCLAMATION
  69. Message Box - Hộp thông báo ™ Để tạo lập hộp thông báo với Icon như trên ta sử dụng hàm MessageBox như sau: int nRes = MessageBox (“Do you want to continue ?”, “My Application”, MB_YESNO | MB_ICONQUESTION )
  70. Message Box - Hộp thông báo ™ Để tạo lập hộp thông báo với Icon như trên ta sử dụng hàm MessageBox như sau: int nRes = MessageBox (“Do you want to save the changes to Document1 ?”, “Microsoft Office Word”, MB_YESNOCANCEL | MB_ICONEXCLAMATION )