- 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. - 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. - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 3 Giới thiệu về MFC – MFC là gì. - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 4 2 Giới thiệu về MFC – MFC là gì ?…(tt. - 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. - 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. - 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. - 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. - 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 Spring 2004 13 Chương trình MFC đầu tiên - Ứ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 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. - Step 1: Chọn loại ứng dụng “An empty project. - 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. - 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 #include "Hello.h" CMyApp myApp. - 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. - 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. - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring Ứng dụng đơn giản – Các thành phần của c.trình…(tt. - 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. - 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. - 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. - 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. - 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. - 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 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. - Step 1: Chọn loại ứng dụng “Dialog-based. - Gõ tiêu đề của ứng dụng vào ô “Enter a title. - 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 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. - 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). - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 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 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 Spring Xử lý Mouse…(tt. - 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. - Đị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 35 Xử lý Mouse…(tt. - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 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. - 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 WM_KEYDOWN Ù OnKeyDown Các bước thực hiện Định nghĩa hàm xử lý message WM_KEYDOWN trong class CxxxDlg C4W - VisualC++ (MFC. - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 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. - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring Xử lý menu - Tạo lập menu Thường có 2 cách chính để tạo menu. - 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 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. - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 43 Xử lý menu - Load và hiển thị menu…(tt. - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 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. - Hàm xử lý tương ứng: CWnd::OnMenuSelect wParam. - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring Xử lý menu - Xử lý khi menu item được chọn…(tt. - WM_COMMAND: phát sinh khi user chọn 1 menu item Hàm xử lý tương ứng: CWnd::OnCommand wParam. - 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. - 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. - 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ý. - Hàm xử lý chung, xác định item hiện hành void CMainFrame::OnDraw. - Hàm xử lý chung, xác định item hiện hành void CMainFrame::OnDraw (UINT nID. - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 51 Xử lý menu - Thay đổi trạng thái menu Các ví dụ. - Cách xử lý void CMainFrame::OnDraw(UINT nID. - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 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. - Step 1: Chọn loại ứng dụng “Single Document”, bỏ option “Document/View architecture support. - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 53 Xử lý menu – Ví dụ…(tt) C4W - VisualC++ (MFC. - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 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. - 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. - 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 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. - 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 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. - 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 Toolbar - Tạo Toolbar bằng lớp CToolBar…(tt. - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 63 Toolbar - Tạo Toolbar bằng lớp CToolBar…(tt. - 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. - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 65 Toolbar - Tạo Toolbar bằng lớp CToolBar…(tt. - 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 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. - 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 Statusbar - Tạo một ứng dụng bằng AppWizard…(tt. - Các xử lý tương ứng. - 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