Bài giảng Lập trình Windows: Chương 2 - Giới thiệu về MFC, Visual C++ 6.0 bao gồm những nội dung về giới thiệu MFC; chương trình MFC đầu tiên; xử lý chuột và bàn phím; Message Box. Mời các bạn tham khảo bài giảng để bổ sung thêm kiến thức về lĩnh vực này.
Trang 1LẬP TRÌNH WINDOWS
Giới thiệu về MFC, Visual C++ 6.0
Trang 4Giới thiệu về MFC
• M icrosoft F oundation C lass
• 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 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
• 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
• Ta vẫn có thể gọi các hàm Windows API trong MFC
Trang 5Giới thiệu về MFC
• Đ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
Trang 6Các thành phần trong ứng dụng Visual C++
Trang 7Chươ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)
Trang 8Chươ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
Trang 9Chương trình MFC đầu tiê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 ”
Chọn loại ứng dụng “ An empty project ”
Nhấn Finish để kết thúc
Trang 10Chương trình MFC đầu tiên –
tạo ứng dụng
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 ”
Trang 11Chương trình MFC đầu tiên –
Trang 12Chương trình MFC đầu tiên –
m_pMainWnd = new CMainWindow;
m_pMainWnd->ShowWindow (m_nCmdShow);
m_pMainWnd->UpdateWindow ();
return TRUE;
} //////////////////////////////////////////////////////////
Trang 13Chương trình MFC đầu tiên –
Hello.cpp(tt)
// CMainWindow message map and member functions
BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd)
Trang 14Chương trình MFC đầu tiên –
kết quả
Trang 15Chương trình MFC đầu tiên –
các class của ứng dụng
Trang 16Chương trình MFC đầu tiên –
các thành phần
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 ();
};
Trang 17Chương trình MFC đầu tiên –
Trang 18Chương trình MFC đầu tiên –
các thành phần
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
Trang 19Chương trình MFC đầu tiên –
các thành phần
Trang 20Chương trình MFC đầu tiên –
các thành phần
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
Trang 21Chương trình MFC đầu tiên –
các bước thực thi ứng dụng
Trang 22Chương trình MFC đầu tiên –
đăng ký lớp cửa sổ
Trang 23Chương trình MFC đầu tiên –
tạo lập cửa sổ
Trang 24Chương trình MFC đầu tiên –
Hàm lập cửa sổ
Trang 25Chương trình MFC đầu tiên –
Hàm lập cửa sổ - tham số
Trang 26Chương trình MFC đầu tiên –
Hàm lập cửa sổ - các kiểu dáng cửa sổ
Trang 27Chương trình MFC đầu tiên –
Hiển thị cửa sổ
Trang 28Chương trình MFC đầu tiên –
Vòng lặp và xử lý thông điệp
Trang 29Chương trình MFC đầu tiên –
Message Map – Ánh xạ thông điệp
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ổ
Á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ớp khác trong khai báo lớpclass CMainWindow : public CFrameWnd{ public:
CMainWindow ();
protected:
afx_msg void OnPaint ();
DECLARE_MESSAGE_MAP () };
Trang 30Chương trình MFC đầu tiên –
Message Map – Ánh xạ thông điệp
Mỗi message sẽ được xử lý bởi 1 hàm thành phần
o WM_PAINT sẽ được chuyển thành O n P aint
o WM_MOUSEMOVE sẽ được chuyển thành
OnMouseMove
o WM_LBUTTONDOWN sẽ được chuyển thành
O n LB utton D own
Trang 31Chương trình MFC đầu tiên –
Message Map – Ánh xạ thông điệp
afx_msg void OnPaint ();
afx_msg void OnLButtonDown(UINT , CPoint);
afx_msg void OnMouseMove(UINT, CPoint);
DECLARE_MESSAGE_MAP () };
Trang 32Chương trình MFC đầu tiên –
Message Map – Ánh xạ thông điệp
Trang 33Chương trình MFC đầu tiên –
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
Trang 34Tạ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 ”
Nhấn “Next” đến “Step 4 of 6”
Trang 35Tạo ứng dụng MFC bằng APPWizard
Chọn loại project “MFC AppWizard (EXE)”
Trang 36Tạo ứng dụng MFC bằng APPWizard
Chọn option “ Single document ”
Trang 37Tạo ứng dụng MFC bằng APPWizard
Chọn option “ None ”
Trang 38Tạo ứng dụng MFC bằng APPWizard
Chọn option “ Next ”
Trang 39Tạo ứng dụng MFC bằng APPWizard
Chọn option “ Next ”
Trang 40Tạo ứng dụng MFC bằng APPWizard
Chọn “ Finish ”
Trang 41Xử lý thông điệp chuột
Trang 42Message Map và ClassWizard
Trang 43Hàm xử lý thông điệp chuột tương ứng
void CMouseView::OnLButtonDown(UINT nFlags, CPoint point)
Trang 44Hàm xử lý thông điệp chuột tương ứng
void CMouseView::OnLButtonDown(UINT nFlags, CPoint point)
Trang 45Kết quả
Trang 46Hàm xử lý thông điệp chuột tương ứng
void CMouseView::OnLButtonDown(UINT nFlags, CPoint point)
Trang 47Kết quả
Trang 48Xử 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
o Hàm xử lý tương ứng: CWnd::OnKeyDown,
CWnd::OnKeyUp
o wParam: virtual-key code
o lParam: chứa các thông tin khác (số lần lặp lại phím, scan code,
Trang 50Xử 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ụ
Trang 51hoặc các drop-down menu khác.
VD File, Edit, …
đượ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, …
ở vị trí bất kỳ trên màn hình (thường khi nhấn nút phải mouse)
VD Minimize, Maximize, Close, …
Trang 52Xử 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, …
Trang 53MENUITEM "E&xit", ID_APP_EXITEND
END
Trang 54Xử 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();
Trang 55Message Box
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 56Các kiểu hộp thông báo và giá trị trả về tương ứng
MB_ABORTRETRYIGNO
Trang 57Message Box - Ví dụ
Để tạo lập hộp thông báo trên ta sử dụng hàm MessageBox
như sau:
int nRes = MessageBox (“Are you sure you want to delete
these 2 items?”, “Confirm Multiple File Delete”,
MB_YESNO)
Chọn “Yes” → nRes =IDYES
Chọn “No” → nRes = IDNO
Trang 58Message Box - Ví dụ
Để 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 59Message Box
- Các kiểu biểu tượng trong hộp thông báo
Trang 60Message Box - Ví dụ
Để 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 continue”, “My
Application”, MB_YESNO | MB_ICONQUESTION)
Chọn “Yes” → nRes =IDYES
Chọn “No” → nRes = IDNO
Trang 61Message Box - Ví dụ
Để 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 | MB_ICONEXCLAMATION)
Chọn “Yes” → nRes =IDYES
Chọn “No” → nRes = IDNO
Chọn “Cancel” → nRes =
IDCANCEL