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ọ...
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:
lap_trinh_c_tren_windows_ky_thuat_lap_trinh_visual_c_mfc_ngu.pdf



