Academia.eduAcademia.edu
Lập trình C trên Windows Kỹ thuật lập trình Visual C++ (MFC) Nguyễn Tri Tuấn Khoa CNTT – ĐH.KHTN.Tp.HCM Email: nttuan@ fit.hcmuns.edu.vn         Nội dung Giới thiệu về MFC Chương trình MFC đ u tiên Xử lý Mouse và Keyboard Xử lý menu Toolbar, Statusbar Các Control Xây dựng và xử lý hộp thoại (Dialog box) Documents và Views: Scroll view, List view, Tree view  SDI – Single Document Interface  MDI - Multi Document Interface C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 2 1 Giới thiệu về MFC  MFC là gì ?  Một số tính năng c a MFC qua từng version  Các thành ph n c a 1 ng dụng trong VC++  Các màn hình giao diện chính c a VC++ 6 C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 3 Giới thiệu về MFC – MFC là gì ?       Microsoft Foundation Class Là một thư viện các lớp (class, OOP) trong ngôn ngữ Visual C++, dùng cho việc lập trình trên Windows Được xây dựng trên cơ sở các hàm thư viện API c a Windows Version 6 có khoảng 200 class Giúp cho 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 Ta vẫn có thể gọi các hàm Windows API trong MFC C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 4 2 Giới thiệu về MFC – MFC là gì ?…(tt)  Trong 1 ng dụng MFC, ta thường không gọi hàm Windows API trực tiếp, mà sẽ tạo các object từ những lớp c a MFC, và gọi phương th c c a object đó  Đa số các phương th c c a MFC class có cùng tên với những hàm Windows API  MFC tạo ra một Application Framework, giúp: ƒ ƒ Thiết lập kiến trúc c a ng dụng một cách nhất quán và khoa họ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 C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 5 Giới thiệu về MFC - Một số tính năng c a MFC  Version 1: ƒ ƒ  ƒ 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: ƒ ƒ ƒ ƒ ƒ ƒ ƒ File open, save Print preview, printing Scrolling window, Splitter window Toolbar, Statusbar Truy xuất được đến các control c a VB Trợ giúp theo ngữ cảnh (Context-sensitive help) DLL C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 6 3 Giới thiệu về MFC - Một số tính năng c a MFC…(tt)    Version 2.5: ƒ ƒ Hỗ trợ ODBC (Open Database Connectivity), cho phép truy xuất đến các CSDL Access, FoxPro, SQL Server,… OLE 2.01 Version 3: ƒ ƒ Hỗ trợ tab dialog (property sheet) Docking control bar Version 3.1: ƒ ƒ ƒ Hỗ trợ các control chu n c a Windows 95 ODBC level 2 with Access Jet database engine Các lớp Winsock phục vụ lập trình TCP/IP C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 7 Giới thiệu về MFC - Một số tính năng c a MFC…(tt)  Version 4.0: ƒ ƒ ƒ  ƒ ADO (Data Access Object) Windows 95 docking control bar Bổ sung thêm lớp TreeView và RichEdit Các lớp đồng bộ hoá các tiểu trình Version 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 Tăng cường một số khả năng c a ODBC C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 8 4 Giới thiệu về MFC - Một số tính năng c a MFC…(tt)  Version 6: ƒ ƒ ƒ ƒ Hỗ trợ các lớp cho những control chu n trong IE 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 C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 9 Giới thiệu về MFC - Các thành ph n c a 1 ng dụng Sơ đồ biên dịch các thành ph n c a 1 ng dụng trong VC++ C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 10 5 Giới thiệu về MFC - Các màn hình giao diện chính Các thành ph n giao diện chính c a VC++ C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 11 Giới thiệu về MFC - Các màn hình giao diện chính…(tt) Các thành ph n giao diện chính c a VC++ (run-time) C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 12 6 Chương trình MFC đ u tiên   ng dụng đơn giản dùng Application Framework ng dụng ph c tạp hơn (Dialog-based App) C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Chương trình MFC đ u tiên - Spring 2004 ng dụng đơn giản  Tạo ng dụng  Các thành ph n c a chương trình C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13 Spring 2004 14 7 ng dụng đơn giản - Tạo ng dụng         Chọn menu File Æ New Chọn tab Projects Chọn loại project “Win32 Application” Đặt tên project và xác định đường dẫn thư mục trong ô “Location” Step 1: Chọn loại ng dụng “An empty project” Nhấn Finish để kết thúc Add các file Hello.h và Hello.cpp vào project Chọn menu Project Æ Settings ƒ Chọn project trong cửa sổ bên trái ƒ Chọn tab General ƒ Chọn “Use MFC In A Shared DLL” C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 15 ng dụng đơn giản - Tạo ng dụng…(tt) Hello.h class CMyApp : public CWinApp { public: virtual BOOL InitInstance (); }; class CMainWindow : public CFrameWnd { public: CMainWindow (); protected: afx_msg void OnPaint (); DECLARE_MESSAGE_MAP () }; C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 16 8 ng dụng đơn giản - Tạo ng dụng…(tt) Hello.cpp #include <afxwin.h> #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; } ///////////////////////////////////////////////////////////////////////// // CMainWindow message map and member functions BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd) ON_WM_PAINT () END_MESSAGE_MAP () C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 17 ng dụng đơn giản - Tạo ng dụng…(tt) Hello.cpp…(tt) 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); } C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 18 9 ng dụng đơn giản - Tạo ng dụng…(tt) ng dụng MFC đơn giản C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM    Spring 2004 19 ng dụng đơn giản – Các thành ph n c a c.trình CWinApp: lớp chính c a MFC để quản lý ng dụng. Ch a đựng vòng lặp nhận message và phân phối message đến các cửa sổ c a ng dụng CMyApp: lớp kế thừa từ lớp CWinApp class CMyApp : public CWinApp { public: virtual BOOL InitInstance (); }; InitInstance(): hàm khởi tạo ng dụng, override lên hàm chu n c a lớp CWinApp BOOL CMyApp::InitInstance () { m_pMainWnd = new CMainWindow; m_pMainWnd->ShowWindow (m_nCmdShow); m_pMainWnd->UpdateWindow (); return TRUE; } C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 20 10 ng dụng đơn giản – Các thành ph n c a c.trình…(tt)    CWnd: lớp chính c a MFC để quản lý các loại cửa sổ giao diện. Có nhiều lớp được kế thừa từ lớp nà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ửa sổ giao diện chính c a ng dụng CMainWindow: lớp kế thừa từ lớp CFrameWnd class CMainWindow : public CFrameWnd { public: CMainWindow (); protected: afx_msg void OnPaint (); DECLARE_MESSAGE_MAP () }; C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM  Spring 2004 21 ng dụng đơn giản – Các thành ph n c a c.trình…(tt) CMainWindow(): hàm khởi tạo cửa sổ giao diện c a ng dụng, override lên hàm chu n c a lớp CFrameWnd CMainWindow::CMainWindow () { Create (NULL, _T ("The Hello Application")); }  OnPaint: hàm thành ph n c a lớp CMainWindow, được gọ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); CRect rect; GetClientRect (&rect); dc.DrawText (_T ("Hello, MFC"), -1, &rect, DT_SINGLELINE ¦ DT_CENTER ¦ DT_VCENTER); } C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 22 11  ng dụng đơn giản – Các thành ph n c a c.trình…(tt) Message Map: ƒ ƒ ƒ ƒ Làm sao để xử lý 1 message ? MFC dùng Message Map để liên kết các message với những hàm thành ph n c a lớp cửa sổ Mỗi message sẽ được xử lý bởi 1 hàm thành ph n tương ng BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd) ON_WM_PAINT () END_MESSAGE_MAP () ON_WM_PAINT là 1 macro được định nghĩa trong Afxmsg_.h, mặc nhiên liên kết message WM_PAINT với hàm OnPaint C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 23 ng dụng đơn giản – Các thành ph n c a c.trình…(tt)  Xử lý thêm message WM_LBUTTONDOWN ƒ ƒ ƒ Bổ sung thêm 1 hàm thành ph n vào khai báo c a lớp CMainWindow: afx_msg void OnLButtonDown(UINT nFlags, CPoint point); Bổ sung thêm 1 macro vào khai báo Message Map: ON_WM_LBUTTONDOWN () Định nghĩa hàm thành ph n OnLButtonDown: void CMainWindow::OnLButtonDown(UINT nFlags, CPoint point) { MessageBox("Left button clicked !", "Mouse", MB_OK); } C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 24 12 ng dụng đơn giản – Các thành ph n c a c.trình…(tt)  Xử lý thêm message WM_MOUSELEAVE ƒ Bổ sung thêm 1 hàm thành ph n vào khai báo c a lớp CMainWindow: afx_msg LRESULT OnMouseLeave(); ƒ Bổ sung thêm 1 macro vào khai báo Message Map: ON_MESSAGE (WM_MOUSELEAVE, OnMouseLeave) ƒ Định nghĩa hàm thành ph n OnLButtonDown: LRESULT CMainWindow::OnMouseLeave() { MessageBox("Mouse leaved !", "Mouse", MB_OK); return 0; } C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 25 Chương trình MFC đ u tiên – Dialog-based App   Tạo ng dụng bằng cách sử dụng MFC AppWizard Các thành ph n c a chương trình C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 26 13 Dialog-based App - Tạo ng dụng bằng MFC AppWizard Chọn menu File Æ New  Chọn tab Projects  Chọn loại project “MFC AppWizard (exe)”  Đặt tên project và xác định đường dẫn thư mục trong ô “Location”  Step 1: Chọn loại ng dụng “Dialog-based”  Step 2: Chỉ chọn option “3D controls”. Gõ tiêu đề c a ng dụng vào ô “Enter a title…”  Step 3: chọn theo chế độ mặc định  Nhấn Finish để kết thúc  C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 27 Dialog-based App - Tạo ng dụng bằng MFC AppWizard…(tt) ng dụng MFC (Dialog-based) C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 28 14 Dialog-based App - Các thành ph n c a chương trình  Các file chương trình: (xxx là tên project) ƒ ƒ ƒ ƒ ƒ ƒ xxx.h: header file c a file xxx.cpp, ch a khai báo lớp CxxxApp để quản lý toàn bộ ng dụng. Lớp CxxxApp kế thừa từ lớp CWinApp c a MFC xxxDlg.h: header file c a file xxxDlg.cpp, ch a khai báo lớp CxxxDlg để quản lý cửa sổ Dialog giao diện c a ng dụng. Lớp CxxxDlg kế thừa từ lớp CDialog c a MFC Resource.h: header file, ch a các hằng ID c a các resource được định nghĩa trong file xxx.rc xxxDlg.cpp: cài đặt các hàm thành ph n c a lớp CxxxDlg xxx.cpp: cài đặt các hàm thành ph n c a lớp CxxxApp xxx.rc: mô tả các resource (tài nguyên) c a ng dụng C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 29 Dialog - based App- Các thành ph n c a chương trình…(tt)  Lớp CxxxDlg: ƒ Trong ng dụng Dialog-based, cửa sổ giao diện chính là 1 Dialog, nên ng dụng dùng lớp CxxxDlg thay vì lớp CMainWindow class CxxxDlg : public CDialog { public: CxxxDlg(CWnd* pParent = NULL); enum { IDD = IDD_xxx_DIALOG }; protected: virtual void DoDataExchange(CDataExchange* pDX); protected: HICON m_hIcon; virtual BOOL OnInitDialog(); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() }; C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 30 15 Xử lý Mouse và Keyboard  Xử lý mouse ƒ ƒ  Thông điệp c a mouse Ví dụ: Vẽ hình bằng mouse Xử lý keyboard ƒ ƒ Thông điệp c a keyboard Ví dụ: Xử lý phím nhấn C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 31 Spring 2004 32 Xử lý Mouse  Thông điệp c a mouse ƒ ƒ ƒ ƒ ƒ ƒ ƒ ƒ WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTONDBLCLK WM_RBUTTONDOWN WM_RBUTTONUP WM_RBUTTONDBLCLK WM_MOUSEMOVE WM_MOUSEWHEEL C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 16 Xử lý Mouse…(tt)  Thông điệp c a mouse (tt) ƒ ƒ ƒ Với mỗi thông điệp c a mouse, Windows gởi kèm 2 tham số wParam và lParam wParam: cho biết phím nào đang được nhấn (Ctrl, Shift) lParam: cho biết toạ độ hiện tại  LOWORD(lParam): tọa độ x  HIWORD(lParam): tọa độ y C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 33 Xử lý Mouse…(tt)  Ví dụ: Vẽ hình bằng mouse ƒ ƒ Mô tả: khi user nhấn giữ nút trái chuột & di chuyển Æ vẽ 1 đường thẳng Các xử lý c n thiết:   ƒ WM_LBUTTONDOWN Ù OnLButtonDown WM_MOUSEMOVE Ù OnMouseMove Các bước thực hiện:    Định nghĩa 2 biến m_PrevX, m_PrevY trong class CxxxDlg Định nghĩa hàm xử lý message WM_LBUTTONDOWN trong class CxxxDlg Định nghĩa hàm xử lý message WM_MOUSEMOVE trong class CxxxDlg C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 34 17 Xử lý Mouse…(tt)  Vẽ hình bằng mouse…(tt) void CxxxDlg::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here // and/or call default m_PrevX = point.x; m_PrevY = point.y; CDialog::OnLButtonDown(nFlags, point); } C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM  Spring 2004 35 Xử lý Mouse…(tt) Vẽ hình bằng mouse…(tt) void CxxxDlg::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here if ((nFlags & MK_LBUTTON) == MK_LBUTTON) { // Get the Device Context CClientDC dc(this); // Draw a line from the prev point to current point dc.MoveTo(m_StartX, m_StartY); dc.LineTo(point.x, point.y); // Save the current point as the previous point m_PrevX = point.x; m_PrevY = point.y; } CDialog::OnMouseMove(nFlags, point); } C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 36 18 Xử lý keyboard  Thông điệp c a keyboard ƒ WM_KEYDOWN / WM_KEYUP: phát sinh khi 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 a các thông tin khác (số l n lặp lại phím, scan code, extended key,…) WM_CHAR: là kết quả phát sinh do message WM_KEYDOWN, báo hiệu 1 ký tự in được (printed character) đã được tạo ra    Hàm xử lý tương ng: CWnd::OnChar wParam: mã ký tự lParam: ch a các thông tin khác (số l n lặp lại do nhấn giữ phím, có phím Alt nhấn kèm,…) C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 37 Xử lý keyboard…(tt)  Ví dụ: Xử lý phím nhấn ƒ Mô tả: khi user nhấn một phím Æ hiển thị 1 MessageBox thông báo ƒ Các xử lý c n thiết ƒ Các bước thực hiện  WM_KEYDOWN Ù OnKeyDown  Định nghĩa hàm xử lý message WM_KEYDOWN trong class CxxxDlg C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 38 19 Xử lý menu  Một vài khái niệm  Tạo lập menu  Load và hiển thị menu  Xử lý khi menu item được chọn  Thay đổi trạng thái menu  Ví dụ C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 39 Xử lý menu - Một vài khái niệm      Menu bar: thanh menu. Bao gồm nhiều drop-down menu và menu item Drop-down menu: một ph n c a menu bar, ch a các menu item hoặc các drop-down menu khác. VD. File, Edit, … Menu item: tương ng với 1 lệnh c a chương trình. Mỗi menu item được xác định bằng 1 số nguyên phân biệt, gọi là item ID hay command ID. VD. Open, Save, … Popup menu: giống như drop-down menu, nhưng có thể xuất hiện ở vị trí bất kỳ trên màn hình (thường khi nhấn nút phải mouse) System menu: ch a các lệnh hệ thống điều khiển cửa sổ. VD. Minimize, Maximize, Close, … C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 40 20 Xử lý menu - Tạo lập menu  Thường có 2 cách chính để tạo menu: ƒ ƒ Tạo menu ở dạng resource c a ng dụng, và load vào khi chạy Tạo trực tiếp bằng các hàm khi ng dụng đang chạy.  Lớp sử dụng để quản lý menu: CMenu  Các hàm thành ph n: CreateMenu, InsertMenu, … C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 41 Xử lý menu - Tạo lập menu…(tt) xxx.rc IDR_MAINFRAME MENU PRELOAD DISCARDABLE BEGIN POPUP "&File" BEGIN MENUITEM "&New\tCtrl+N", ID_FILE_NEW MENUITEM "&Open...\tCtrl+O", ID_FILE_OPEN MENUITEM SEPARATOR MENUITEM "E&xit", ID_APP_EXIT END POPUP "&Edit" BEGIN MENUITEM "&Undo\tCtrl+Z", ID_EDIT_UNDO MENUITEM SEPARATOR MENUITEM "Cu&t\tCtrl+X", ID_EDIT_CUT MENUITEM "&Copy\tCtrl+C", ID_EDIT_COPY MENUITEM "&Paste\tCtrl+V", ID_EDIT_PASTE END END C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 42 21 Xử lý menu - Load và hiển thị menu  Xác định menu bar khi tạo cửa sổ: Create(NULL, _T("My Application"), WS_OVERLAPPEDWINDOW, rectDefault, NULL, MAKEINTRESOURCE(IDR_MAINFRAME));  Thay đổi menu bar: CMenu menu; menu.LoadMenu(IDR_MAINFRAME); SetMenu(&menu); menu.Detach(); C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 43 Xử lý menu - Load và hiển thị menu…(tt)     MAKEINTRESOURCE: macro dùng để chuyển đổi 1 số nguyên (resource ID) thành dạng LPSTR CMenu::LoadMenu: load 1 resource menu bar và gán vào đối tượng CMenu CWnd::SetMenu: gán menu bar cho 1 cửa sổ CMenu::Detach: gỡ bỏ menu bar ra khỏi đối tượng CMenu, để menu bar không bị huỷ bỏ cùng với đối tượng CMenu khi ra khỏi phạm vi khai báo C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 44 22 Xử lý menu - Xử lý khi menu item được chọn  Các thông điệp c a menu  Xử lý lệnh c a menu item  Nhóm lệnh (Command range) C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM  Spring 2004 45 Xử lý menu - Xử lý khi menu item được chọn…(tt) Các thông điệp c a menu: ƒ WM_MENUSELECT: phát sinh khi user tác động lên menu. Thông điệp này có thể dùng để cập nhật trạng thái c a menu (trường hợp menu thay đổi theo ngữ cảnh – Context-sensitive Menu)  Hàm xử lý tương ng: CWnd::OnMenuSelect  wParam: ƒ ƒ LOWORD(wParam): ID c a menu item hoặc index c a menu popup HIWORD(wParam): các thông tin khác (trạng thái menu, loại menu, …)  lParam: handle c a menu C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 46 23  Xử lý menu - Xử lý khi menu item được chọn…(tt) Các thông điệp c a menu: (tt) ƒ WM_COMMAND: phát sinh khi user chọn 1 menu item  Hàm xử lý tương ng: CWnd::OnCommand  wParam: ƒ ƒ LOWORD(wParam): ID c a menu item hoặc c a control HIWORD(wParam): nguồn gốc phát sinh, 1 nếu sinh ra do 1 phím tắt; 0 nếu chọn trực tiếp từ menu  lParam: ƒ ƒ NULL nếu message này phát sinh từ menu Nếu message phát sinh từ 1 control, lParam sẽ ch a handle c a control đó C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 47 Xử lý menu - Xử lý khi menu item được chọn…(tt)  Xử lý lệnh c a menu item ƒ ƒ Dựa trên message WM_COMMAND Định nghĩa message map ON_COMMAND (ID_FILE_OPEN, OnMyFileOpen) ON_COMMAND (ID_FILE_EXIT, OnMyFileExit) ƒ Viết hàm thành ph n xử lý cho menu item tương ng void CMainFrame::OnMyFileOpen () { // Thực hiện thao tác mở file … } void CMainFrame::OnMyFileExit () { PostMessage (WM_CLOSE, 0, 0); } C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 48 24  Xử lý menu - Xử lý khi menu item được chọn…(tt) Nhóm lệnh (Command range) ƒ ƒ ƒ Là 1 nhóm menu item hoạt động theo nguyên tắc “Chỉ có 1 ph n tử được chọn tại 1 thời điểm” VD. Ch c năng vẽ hình “Line / Circle / Rectangle” Cách th c xử lý ?  Cách 1: map tất cả xử lý c a các menu item này vào chung 1 hàm xử lý  Cách 2: dùng macro ON_COMMAND_RANGE C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM  Spring 2004 49 Xử lý menu - Xử lý khi menu item được chọn…(tt) Nhóm lệnh (Command range) (tt) ƒ Cách 1: map tất cả xử lý c a các menu item này vào chung 1 hàm xử lý // Định nghĩa Message map ON_COMMAND (ID_DRAW_LINE, OnDraw) ON_COMMAND (ID_DRAW_CIRCLE, OnDraw) ON_COMMAND (ID_DRAW_RECTANGLE, OnDraw) // Hàm xử lý chung, xác định item hiện hành void CMainFrame::OnDraw () { m_nCurrentDraw = (UINT) LOWORD(GetCurrentMessage()->wParam); } C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 50 25  Xử lý menu - Xử lý khi menu item được chọn…(tt) Nhóm lệnh (Command range) (tt) ƒ Cách 2: dùng macro ON_COMMAND_RANGE // Định nghĩa Message map ON_COMMAND_RANGE (ID_DRAW_LINE, ID_DRAW_RECTANGLE, OnDraw) // Hàm xử lý chung, xác định item hiện hành void CMainFrame::OnDraw (UINT nID) { m_nCurrentDraw = nID; } C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM  51 Xử lý menu - Thay đổi trạng thái menu Các ví dụ: ƒ ƒ ƒ  Spring 2004 ƒ Khi user chọn ch c năng vẽ Circle Æ c n thể hiện 1 dấu check (;) phía trước Ch c năng Cut/Copy/Delete chỉ được kích hoạt khi user đánh dấu chọn 1 đoạn text Ch c năng Paste chỉ được kích hoạt khi clipboard khác rỗng ... Cách xử lý void CMainFrame::OnDraw(UINT nID) { CMenu* pMenu = GetMenu(); pMenu->CheckMenuItem(m_nCurrentDraw,MF_UNCHECKED); m_nCurrentDraw = nID; pMenu->CheckMenuItem(m_nCurrentDraw, MF_CHECKED); } C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 52 26 Xử lý menu – Ví dụ  Tạo 1 ng dụng SDI ƒ ƒ ƒ ƒ ƒ ƒ Chọn menu File Æ New Chọn tab Projects Chọn loại project “MFC AppWizard (exe)” Đặt tên project và 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 Finish để kết thúc C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 53 Spring 2004 54 Xử lý menu – Ví dụ…(tt) C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 27 Xử lý menu – Ví dụ…(tt)  Xử lý lệnh c a menu item ƒ ƒ Vẽ thêm vào menu popup File các item: New, Open, Save Định nghĩa Message Map cho các hàm xử lý item ON_COMMAND(ID_FILE_NEW, OnFileNew) ON_COMMAND(ID_FILE_OPEN, OnFileOpen) ON_COMMAND(ID_FILE_SAVE, OnFileSave) C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 55 Xử lý menu – Ví dụ…(tt)  Xử lý lệnh c a menu item (tt) ƒ Viết xử lý lệnh cho từng item void CMainFrame::OnFileNew() { // TODO: Add your command handler code here MessageBox("Ban vua chon item New", “File"); } void CMainFrame::OnFileOpen() { // TODO: Add your command handler code here MessageBox("Ban vua chon item Open", “File"); } void CMainFrame::OnFileSave() { // TODO: Add your command handler code here MessageBox("Ban vua chon item Save", “File"); } C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 56 28 Xử lý menu – Ví dụ…(tt)  Xử lý chọn nhóm lệnh ƒ ƒ ƒ Vẽ thêm menu popup Draw với các item: Line, Circle, Rectangle Định nghĩa message map ON_COMMAND_RANGE (ID_DRAW_LINE, ID_DRAW_RECTANGLE, OnDraw) Viết hàm xử lý void CMainFrame::OnDraw(UINT nID) { CMenu* pMenu = GetMenu(); pMenu->CheckMenuItem(m_nCurrentDraw, MF_UNCHECKED); m_nCurrentDraw = nID; pMenu->CheckMenuItem(m_nCurrentDraw, MF_CHECKED); } C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 57 Toolbar   Tạo một ng dụng có Toolbar bằng AppWizard Tạo Toolbar bằng lớp CToolBar C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 58 29 Toolbar - Tạo một ng dụng bằng AppWizard  Tạo một ng dụng có Toolbar bằng AppWizard ƒ ƒ ƒ ƒ ƒ ƒ Chọn menu File Æ New Chọn tab Projects Chọn loại project “MFC AppWizard (exe)” Đặt tên project và 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 Finish để kết thúc C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 59 Toolbar - Tạo một ng dụng bằng AppWizard…(tt) Chọn option này để AppWizard tự động tạo ra một Docking Toolbar C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 60 30 Toolbar - Tạo một ng dụng bằng AppWizard…(tt)  Các xử lý trong hàm OnCreate c a lớp CMainFrame if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create } // Xác định thuộc tính Docking m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 61 Toolbar - Tạo Toolbar bằng lớp CToolBar    Tạo lập và hiển thị n/hiện thanh ToolBar Thêm các ToolTip và FlyBy text C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 62 31 Toolbar - Tạo Toolbar bằng lớp CToolBar…(tt)  Tạo lập và hiển thị: ƒ ƒ Bước 1: thiết kế DrawToolBar bằng RC editor, bao gồm các ch c năng: Line, Circle, Rectangle, có ID là IDR_DRAWTOOLBAR Bước 2: trong class CMainFrame, định nghĩa biến quản lý DrawToolBar // class CMainFrame CToolBar m_wndDrawToolBar; C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 63 Toolbar - Tạo Toolbar bằng lớp CToolBar…(tt)  Bước 3: trong hàm OnCreate c a lớp CMainFrame, viết lệnh tạo lập DrawToolBar // Trong hàm CMainFrame::OnCreate if (!m_wndDrawToolBar.Create(this) || !m_wndDrawToolBar.LoadToolBar(IDR_DRAWTOOLBAR)) { TRACE0(“Khong the tao duoc DrawToolBat\n"); return -1; } // Xác định tính chất của ToolBar m_wndDrawToolBar.SetBarStyle( m_wndDrawToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); // Xác định tính chất Docking m_wndDrawToolBar.EnableDocking(CBRS_ALIGN_ANY); // Docking toolbar DockControlBar(&m_wndDrawToolBar); C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 64 32 Toolbar - Tạo Toolbar bằng lớp CToolBar…(tt)  ƒ n/hiện thanh ToolBar Cách thực hiện:   Thêm 1 menu item mới vào menu popup View, với ID là ID_VIEW_DRAWTOOLBAR Viết hàm xử lý cho menu item này void CMainFrame::OnViewDrawtoolbar() { // TODO: Add your command handler code here BOOL bVisible = m_wndDrawToolBar.GetStyle() & WS_VISIBLE; ShowControlBar(&m_wndDrawToolBar, !bVisible, FALSE); CMenu* pMenu = GetMenu(); pMenu->CheckMenuItem(ID_VIEW_DRAWTOOLBAR, (!bVisible==1) ? MF_CHECKED : MF_UNCHECKED); } C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 65 Toolbar - Tạo Toolbar bằng lớp CToolBar…(tt)  Thêm các ToolTip và FlyBy text ƒ ƒ ToolTip là 1 cửa sổ nhỏ ch a câu giải thích ngắn về công dụng c a 1 button trên ToolBar FlyBy text là 1 câu thông báo được hiển thị trên StatusBar khi user di chuyển mouse đến 1 button c a ToolBar C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 66 33  Toolbar - Tạo Toolbar bằng lớp CToolBar…(tt) Thêm các ToolTip và FlyBy text (tt) ƒ Cách thực hiện:  ToolBar phải có thuộc tính CBRS_TOOLTIPS ¦ CBRS_FLYBY  Tạo 1 bảng mô tả chuỗi (StringTable)  ID c a chuỗi trùng với ID c a các button trên ToolBar  Chuỗi có thể gồm 2 ph n: <FlyBy Text>\n<ToolTip> VD. STRINGTABLE DISCARDABLE BEGIN ID_DRAW_LINE "Draw a line\nLine“ ID_DRAW_CIRCLE "Draw a circle\nCircle" ID_DRAW_RECTANGLE "Draw a rect\nRectangle" END C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 67 Statusbar   Tạo một ng dụng có Statusbar bằng AppWizard Tạo Statusbar bằng lớp CStatusBar C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 68 34 Statusbar - Tạo một ng dụng bằng AppWizard  Tạo một ng dụng có Statusbar bằng AppWizard ƒ ƒ ƒ ƒ ƒ ƒ Chọn menu File Æ New Chọn tab Projects Chọn loại project “MFC AppWizard (exe)” Đặt tên project và 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 Finish để kết thúc C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 69 Statusbar - Tạo một ng dụng bằng AppWizard…(tt) Chọn option này để AppWizard tự động tạo ra một Statusbar C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 70 35 Statusbar - Tạo một ng dụng bằng AppWizard…(tt)  Các xử lý tương ng // Định nghĩa các vùng trên Statusbar // (file MainFrm.cpp) static UINT indicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; // Tạo lập Statusbar (hàm OnCreate của lớp CMainFrame) if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0(“Không thể tạo được Statusbar\n"); return -1; // fail to create } C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 71 Statusbar - Tạo Statusbar bằng lớp CStatusBar  Tạo lập và hiển thị  n/hiện Statusbar   Thể hiện giúp đỡ cho các menu item Phân vùng trên Statusbar C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 72 36