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
Trang 1Đại Học Sư Phạm Tp Hồ Chí Minh
KỸ THUẬT LẬP TRÌNH
VISUAL C++
(MFC – Microsoft Foundation Classes)
Trần Ngọc Bảo Email: tnbao.dhsp@gmail.com
Trang 4Giớ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
đó 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
Trang 5 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
Giới thiệu về MFC (2/2)
Trang 6Một số tính năng của MFC (1/4)
Version 1: (Visual C++ 1.0)
Version 2: (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
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
Trang 7 Hỗ trợ Tab dialog (property sheet)
Docking tool bar
Trang 8 Version 4.0: (Visual C++ 4.0)
Version 4.2: (Visual C++ 4.2)
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
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
Một số tính năng của MFC (3/4)
Trang 9 Version 4.21: (Visual C++ 5.0)
Version 6.0: (Visual C++ 6.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)
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
Một số tính năng của MFC (4/4)
Trang 11Các thành phần trong ứng dụng Visual C++
nguyên
Trang 12Cửa sổ chính của MS Visual C++ 6.0
Trang 14MS Visual C++ 6.0 – Class View
Trang 15MS Visual C++ 6.0 – Resource View
Trang 16MS Visual C++ 6.0 – File View
Trang 17Cửa sổ Debugger trong MS Visual C++ 6.0
Trang 19Cá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
Trang 20Các loại ứng dụng (2/2)
Trang 22Ứng dụng MFC đầu tiên – Hello.h
class CMyApp : public CWinApp
Trang 23Ứng dụng MFC đầu tiên – Hello.cpp
return TRUE;
} /////////////////////////////////////////////////////////////////////////
Trang 24Ứng dụng MFC đầu tiên – Hello.cpp (tt)
// CMainWindow message map and member functions
BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd)
Trang 25Kết quả chương trình Hello
Trang 26Các class của ứng dụng Hello
CCmdTarget CObject
Trang 27Các bước thực thi ứng dụng
WinMain
Đăng ký lớp cửa sổ Tạo lập cửa sổ Hiển thị cửa sổ Message Loop
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// TODO: Place code here.
MSG msg;
MyRegisterClass(hInstance);
// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
} // Main message loop:
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
} return msg.wParam;
}
Trang 28Đăng ký lớp cửa sổ
Đăng ký lớp cửa sổ Tạo lập cửa sổ Hiển thị cửa sổ Message Loop
ATOM MyRegisterClass(HINSTANCE hInstance)
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_BAI02);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
m_pMainWnd = new CMainWindow;
m_pMainWnd->ShowWindow (m_nCmdShow);
m_pMainWnd->UpdateWindow (); return TRUE;
}
Trang 29Tạo lập cửa sổ
WinMain
Đăng ký lớp cửa sổ Tạo lập cửa sổ 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);
Create (NULL, _T ("The Hello Application"));
}
Trang 30Hà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)
Trang 31Các tham số trong hàm tạo lập cửa sổ
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
lpszMenuName Thực đơn liên quan đến cửa sổ, NULL nghĩa làcửa sổ không có Menu dwExStyle Kiểu mở rộng của cửa sổ
pContext Sử dụng trong ứng dụng Documents/Views
Trang 32Các kiểu dáng chuẩn của cửa sổ
WS_BORDER Tạo cửa sổ với khung mỏng
WS_CAPTION Tạo cửa sổ với thanh tiêu đề
WS_CHILD Tạo cửa sổ con, sử dụng để tạo điều khiển như phím và các cửa sổ con MDIWS_OVERAPPEP Lập cửa sổ maximize và không có cửa sổ cha
WS_OVERAPPEPWI
NDOW Lập cửa sổ với các kiểu: WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_MAXIMIZEBOX, WS_MINIMIZEBOX,
WS_DISABLED Cửa sổ sẽ bị vô hiệu lực
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
Trang 33Hiển thị cửa sổ
WinMain
Đăng ký lớp cửa sổ Tạo lập cửa sổ 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);
m_pMainWnd = new CMainWindow;
m_pMainWnd->ShowWindow (m_nCmdShow);
m_pMainWnd->UpdateWindow ();
return TRUE;
}
Trang 34Vòng lặp và xử lý thông điệp
WinMain
Đăng ký lớp cửa sổ Tạo lập cửa sổ Hiển thị cửa sổ Message Loop
CMainWindow
Tiếp nhận và xử lý thông điệp như thế nào ?
while (GetMessage (&msg, NULL, 0, 0))
}
Message Map
Trang 35Message 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
Á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
Trang 36 WM_PAINT sẽ được chuyển thành On Paint
WM_MOUSEMOVE sẽ được chuyển thành On MouseMove
WM_LBUTTONDOWN sẽ được chuyển thành On LB utton D own
phần tương ứng
Trang 37BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd)
afx_msg void OnPaint () ;
DECLARE_MESSAGE_MAP () };
Message Map (tt)
Trang 38Message 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)
WM_MOUSEMOVE afx_msg void OnMouseMove(UINT, CPoint)
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()
Thông điệp WM_XXX và hàm MFC tương ứng
Trang 39Xử lý thông điệp cửa sổ - Message Map
Trang 40Tạ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”
Trang 41Tạo ứng dụng MFC bằng AppWizard
Chọn loại project “MFC AppWizard (EXE)”
Trang 42Tạo ứng dụng MFC bằng AppWizard
Chọn option “Single document”
Trang 43Tạo ứng dụng MFC bằng AppWizard
Chọn option “None”
Trang 44Tạo ứng dụng MFC bằng AppWizard
Trang 48Ứng dụng MFC đầu tiên – File view
Trang 49Ứng dụng MFC đầu tiên – Resource view
Trang 50Ứng dụng MFC đầu tiên – Class view
Trang 51Ứng dụng MFC đầu tiên – kết quả chương trình
Trang 53Xử lý thông điệp chuột
WM_LBUTTONDOWN afx_msg void OnLButtonDown(UINT, CPoint)WM_LBUTTONUP afx_msg void OnLButtonUp(UINT, CPoint)WM_LBUTTONBLCLK afx_msg void OnLButtonDblClk(UINT, CPoint)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)
Trang 54Message Map và ClassWizard
Trang 55Hàm xử lý thông điệp chuột tương ứng
Trang 58void CMouseView::OnLButtonDown(UINT nFlags, CPoint point)
Trang 59Hàm xử lý thông điệp chuột tương ứng
void CMouseView::OnLButtonDown(UINT nFlags, CPoint point)
Trang 60Kết quả xử lý thông điệp chuột
Trang 61Hàm xử lý thông điệp chuột tương ứng
void CMouseView::OnLButtonDown(UINT nFlags, CPoint point)
Trang 62Kết quả xử lý thông điệp chuột
Trang 64Message 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)
Trang 65Cá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,
Ignore IDABORT, IDRETRY, IDIGNORE
MB_OKCANCEL OK, Cancel IDOK, IDCANCEL
MB_RETRYCANCEL Retry, Cancel IDRETRY, IDCANCEL
MB_YESNO Yes, No IDYES, IDNO
MB_YESNOCANCEL Yes, No,
Cancel IDYES, IDNO, IDCANCEL
Trang 66Message 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 ?”,
Chọn “Yes” Æ nRes =IDYES
Chọn “No” Æ nRes = IDNO
Trang 67Message 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
Trang 68Các kiểu biểu tượng trong hộp thông báo
MB_ICONEXCLAMATION MB_ICONSTOP
Trang 69Message 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 )
Trang 70Message 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 )