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