610 likes | 790 Views
LẬP TRÌNH WINDOWS. Giới thiệu về MFC, Visual C++ 6.0. Nội dung. • Giới thiệu về MFC • Chương trình MFC đầu tiên • Xử lý chuột và bàn phím • Message Box. Nội dung. • Giới thiệu về MFC • Chương trình MFC đầu tiên • Xử lý chuột và bàn phím • Message Box.
E N D
LẬP TRÌNH WINDOWS Giớithiệuvề MFC, Visual C++ 6.0
Nội dung • Giớithiệuvề MFC • Chươngtrình MFC đầutiên • Xửlýchuộtvàbànphím • Message Box
Nội dung • Giớithiệuvề MFC • Chươngtrình MFC đầutiên • Xửlýchuộtvàbànphím • Message Box
Giớithiệuvề MFC • Microsoft Foundation Class • 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 • Được xây dựng trên cơ sở các hàm thư viện APIcủa Windows • Version 6 cókhoảng 200 class • Giúp cho người lập trình có thể xây dựng ứngdụ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 • Trongmộtứngdụng MFC, tasẽkhônggọitrựctiếpcáchàm Windows API màsẽtạocác object từnhữnglớpcủa MFC, sau đó gọi các hàm của object này • Ta vẫncóthểgọicáchàm Windows API trong MFC
Giớithiệuvề MFC • • Đa số các phương thức của MFC class cócùngtênvớinhữnghàm Windows API • • MFC tạoramộtApplication Framework, giúp: • Thiếtlậpkiếntrúccủaứngdụngmộtcáchnhất • quánvàkhoahọc • Che dấu đi nhiều phần chi tiết mà Windows API • đòi hỏi, giúp developer “thảnh thơi” hơn
Chươngtrình MFC đầutiên Ứng dụng đơn giản dùng Application Framework Ứng dụng phức tạp hơn (Dialog-based App)
Chươngtrình MFC đầutiên – ứngdụngđơngiản Tạoứngdụng Các thành phần của chương trình
Chươngtrình MFC đầutiên – tạoứngdụng Chọn menu File → New Chọn tab Projects Chọnloại project “Win32 Application” Đặt tên project và xác định đường dẫn thư mục trong ô “Location” Chọnloạiứngdụng “An empty project” Nhấn Finish để kết thúc
Chươngtrình MFC đầutiên – tạoứngdụng • Add các file Hello.hvàHello.cppvàoproject • Chọn menu Project → Settings • Chọnprojecttrongcửasổbêntrái • Chọn tab General • Chọn “Use MFC In A Shared DLL”
Chươngtrình MFC đầutiê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 () • };
Chươngtrình MFC đầutiên – Hello.cpp • #include <afxwin.h> • #include "Hello.h" • CMyAppmyApp; • ////////////////////////////////////////////////////////// • // CMyApp member functions • BOOL CMyApp::InitInstance () • { • m_pMainWnd = new CMainWindow; • m_pMainWnd->ShowWindow (m_nCmdShow); • m_pMainWnd->UpdateWindow (); • return TRUE; • } //////////////////////////////////////////////////////////
Chươngtrình MFC đầutiê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); • CRectrect; • GetClientRect (&rect); • dc.DrawText (_T ("Hello, MFC"), -1, &rect, DT_SINGLELINE | • DT_CENTER | DT_VCENTER); • }
Chươngtrình MFC đầutiên – các class củaứngdụng
Chươngtrình MFC đầutiên – cácthànhphần • CWinApp: lớp chính của MFC để quản lý ứngdụng. Chứa đựng vòng lặp nhận message và phânphối message đến các cửa sổ của ứng dụng • CMyApp: lớpkếthừatừlớpCWinApp • class CMyApp : public CWinApp { • public: • virtual BOOL InitInstance (); • };
Chươngtrình MFC đầutiên – cácthànhphần • InitInstance(): hàmkhởitạoứngdụng, override lênhàmchuẩncủalớpCWinApp • BOOL CMyApp::InitInstance () { • m_pMainWnd = new CMainWindow; • m_pMainWnd->ShowWindow (m_nCmdShow); • m_pMainWnd->UpdateWindow (); • return TRUE; • }
Chươngtrình MFC đầutiên – cácthànhphần • CWnd: lớp chính của MFC để quản lý các loại cửasổ giao diện. Có nhiều lớp được kế thừa từ lớpnày để quản lý các loại cửa sổ khác nhau (CTreeCtrl, CListBox, Cedit,…) • CFrameWnd: lớp kế thừa từ lớp CWnd, để quản lýcửasổgiaodiệnchínhcủaứngdụng
Chươngtrình MFC đầutiên – cácthànhphần • CMainWindow: lớpkếthừatừlớpCFrameWnd • classCMainWindow : public CFrameWnd { • public: • CMainWindow (); • protected: • afx_msg void OnPaint (); • DECLARE_MESSAGE_MAP () • };
Chươngtrình MFC đầutiên – cácthànhphần • CMainWindow(): hàmkhởitạocửasổgiaodiệncủaứngdụng, override lênhàmchuẩncủalớpCFrameWnd • CMainWindow::CMainWindow () { • Create (NULL, _T ("The Hello Application")); • } • OnPaint: hàm thành phần của lớp CMainWindow, đượcgọi khi cần cập nhật nội dung cửa sổ. Hàm này đượcđịnh nghĩa chồng lên hàm chuẩn của lớp CFrameWnd. • void CMainWindow::OnPaint () { • CPaintDC dc(this); • CRectrect; • GetClientRect (&rect); • dc.DrawText (_T ("Hello, MFC"), -1, &rect, DT_SINGLELINE ¦ DT_CENTER ¦ DT_VCENTER); • }
Chươngtrình MFC đầutiên – cácbướcthựcthiứngdụng
Chươngtrình MFC đầutiên – Hàmlậpcửasổ - cáckiểudángcửasổ
Chươngtrình MFC đầutiên – Vònglặpvàxửlýthôngđiệp
Chươngtrình MFC đầutiên – Message Map – Ánh xạ thông điệp • MFC dùng Message Map để liên kết các message vớinhữnghàmthànhphầncủalớpcửasổ • Á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 đó • Ánh xạ thông điệp được khai báo như các thành phần lớpkháctrongkhaibáolớp • class CMainWindow : public CFrameWnd{ • public: • CMainWindow (); • protected: • afx_msg void OnPaint (); • DECLARE_MESSAGE_MAP () • };
Chươngtrình MFC đầutiên – Message Map – Ánh xạ thông điệp • Mỗi message sẽ được xử lý bởi 1 hàm thànhphầ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àmtheo 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
Chươngtrình MFC đầutiên – Message Map – Ánh xạ thông điệp • class CMainWindow : public CFrameWnd { • public: • CMainWindow (); • protected: • afx_msg void OnPaint (); • afx_msg void OnLButtonDown(UINT, CPoint); • afx_msg void OnMouseMove(UINT, CPoint); • DECLARE_MESSAGE_MAP () • }; • Khaibáo • Message Map • BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd) • ON_WM_PAINT () • ON_WM_LBUTTONDOWN() • END_MESSAGE_MAP () • void CMainWindow::OnPaint() { • } • void CMainWindow::OnLButtonDown(UINT nFlags, CPoint point){ • } • Cài đặt • xửlý Message
Chươngtrình MFC đầutiên – Xửlýthêm message WM_LBUTTONDOWN • Bổ sung thêm 1 hàmthànhphầnvàokhaibáocủalớpCMainWindow: • afx_msg void OnLButtonDown(UINT nFlags, CPointpoint); • Bổ sung thêm 1 macro vàokhaibáo Message Map: • ON_WM_LBUTTONDOWN () • ĐịnhnghĩahàmthànhphầnOnLButtonDown: • void CMainWindow::OnLButtonDown(UINT nFlags, CPoint point) • { • MessageBox("Left button clicked !", "Mouse", MB_OK); • }
Tạoứngdụng MFC bằngAPPWizard • Chọn menu File → New • Chọn Tab Projects • Chọnloại project “MFC AppWizard (exe)” • Đặttên project trong ô “Project name” • Xác định đường dẫn thư mục trong “Location” • Step 1: Chọnloạiứngdụng “Single Document” • Nhấn “Next” đến “Step 4 of 6”
Tạoứngdụng MFC bằngAPPWizard Chọnloại project “MFC AppWizard (EXE)”
Tạoứngdụng MFC bằngAPPWizard Chọn option “Single document”
Tạoứngdụng MFC bằngAPPWizard Chọn option “None”
Tạoứngdụng MFC bằngAPPWizard Chọn option “Next”
Tạoứngdụng MFC bằngAPPWizard Chọn option “Next”
Tạoứngdụng MFC bằngAPPWizard Chọn “Finish”
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); • }
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); • }
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); • }
Xửlý Keyboard - Thông điệp của keyboard • WM_KEYDOWN / WM_KEYUP: phátsinhkhi 1 phím(không phải là phím hệ thống) được nhấn xuống/thả ra • Hàm xử lý tương ứng: CWnd::OnKeyDown, CWnd::OnKeyUp • wParam: virtual-key code • lParam: chứacácthông tin khác (sốlầnlặplạiphím, scan code, • extended key,…) • WM_CHAR: làkếtquảphátsinh do message WM_KEYDOWN, báo hiệu 1 ký tự in được (printedcharacter) đã được tạo ra • Hàm xử lý tương ứng: CWnd::OnChar • wParam: mã ký tự • lParam: chứacácthông tin khác (sốlầnlặplại do nhấngiữ • phím, cóphím Alt nhấnkèm,…)
Xửlý Keyboard - Vídụ • Vídụ: Xửlýphímnhấn • Môtả: khi user nhấnmộtphím→hiểnthị 1 MessageBoxthôngbáo • Cácxửlýcầnthiết • WM_KEYDOWN ↔OnKeyDown • Địnhnghĩahàmxửlý message WM_KEYDOWN
Xửlý Menu Mộtvàikháiniệm Tạolập menu Load vàhiểnthị menu Xử lý khi menu item được chọn Thay đổi trạng thái menu Vídụ