Lập trình C trên Windows: Kỹ thuật lập trình Visual C++ (MFC) - Nguyễn Tri Tuấn

Tóm tắt Lập trình C trên Windows: Kỹ thuật lập trình Visual C++ (MFC) - Nguyễn Tri Tuấn: ... 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 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 24 Ứng dụng đơn giản – Các thành phần của c.trình(tt)  Xử lý thêm message ...KeyUp  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ự  l...MMAND (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); } 26 Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 51 Xử lý menu - Xử lý khi menu item được chọ...

pdf37 trang | Chia sẻ: havih72 | Lượt xem: 176 | Lượt tải: 0download
Nội dung tài liệu Lập trình C trên Windows: Kỹ thuật lập trình Visual C++ (MFC) - Nguyễn Tri Tuấn, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
tonDown(UINT nFlags, 
CPoint point)
{
MessageBox("Left button clicked !",
"Mouse", MB_OK);
}
13
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 25
Ứ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;
}
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 26
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
14
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 27
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
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 28
Dialog-based App - Tạo ứng dụng bằng MFC AppWizard(tt)
Ứng dụng MFC (Dialog-based)
15
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 29
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
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 30
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()
};
16
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 31
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
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 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
17
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 33
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
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 34
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
18
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 35
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);
}
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 36
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);
}
19
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 37
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,)
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 38
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
20
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 39
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ụ
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 40
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, 
21
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 41
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, 
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 42
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 
22
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 43
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(); 
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 44
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 
23
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 45
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)
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 46
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
24
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 47
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 đó
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 48
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); 
}
25
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 49
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
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 50
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); 
} 
26
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 51
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; 
} 
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 52
Xử lý menu - Thay đổi trạng thái menu
 Các ví dụ:
ƒ 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);
}
27
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 53
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
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 54
Xử lý menu – Ví dụ(tt)
28
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 55
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)
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 56
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");
}
29
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 57
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);
}
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 58
Toolbar
 Tạo một ứng dụng có Toolbar bằng 
AppWizard
 Tạo Toolbar bằng lớp CToolBar
30
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 59
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
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 60
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
31
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 61
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);
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 62
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
32
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 63
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;
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 64
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);
33
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 65
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); 
}
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 66
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 
34
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 67
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:
\n
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
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 68
Statusbar
 Tạo một ứng dụng có Statusbar bằng 
AppWizard
 Tạo Statusbar bằng lớp CStatusBar
35
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 69
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
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 70
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
36
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 71
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
}
Spring 2004C4W - VisualC++ (MFC) - Nguyen Tri Tuan - DH.KHTN Tp.HCM 72
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

File đính kèm:

  • pdflap_trinh_c_tren_windows_ky_thuat_lap_trinh_visual_c_mfc_ngu.pdf