21
Spring 2004C4W -VisualC++ (MFC) -Nguyen Tri Tuan -DH.KHTN Tp.HCM41
Xlý menu -To lp menu
fiThường có2 cách chính để to menu:
§To menu dng resource ca ng dng,
load vào khi chy
§To trc tiếp bng các hàm khi ng dng đang
chy.
fiLp sdng để qun menu: CMenu
fiCác hàm thành phn: CreateMenu, InsertMenu, …
Spring 2004C4W -VisualC++ (MFC) -Nguyen Tri Tuan -DH.KHTN Tp.HCM42
Xlý menu -To lp 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.HCM43
Xlý menu -Load vàhin thmenu
fiXác định menu bar khi to ca s:
Create(NULL, _T("My Application"),
WS_OVERLAPPEDWINDOW, rectDefault, NULL,
MAKEINTRESOURCE(IDR_MAINFRAME));
fiThay đổi menu bar:
CMenu menu;
menu.LoadMenu(IDR_MAINFRAME);
SetMenu(&menu);
menu.Detach();
Spring 2004C4W -VisualC++ (MFC) -Nguyen Tri Tuan -DH.KHTN Tp.HCM44
Xlý menu -Load vàhin thmenu…(tt)
fiMAKEINTRESOURCE: macro dùng để chuyn đổi
1 snguyên (resource ID) thành dng LPSTR
fiCMenu::LoadMenu: load 1 resource menu bar
gán vào đối tượng CMenu
fiCWnd::SetMenu: gán menu bar cho 1 ca s
fiCMenu::Detach: gbmenu bar ra khi đối tượng
CMenu, để menu bar không bhubcùng vi đối
tượng CMenu khi ra khi phm vi khai báo
23
Spring 2004C4W -VisualC++ (MFC) -Nguyen Tri Tuan -DH.KHTN Tp.HCM45
Xlý menu -X lý khi menu item được chn
fiCác thông đip ca menu
fiXlý lnh ca menu item
fiNhóm lnh (Command range)
Spring 2004C4W -VisualC++ (MFC) -Nguyen Tri Tuan -DH.KHTN Tp.HCM46
Xlý menu -X lý khi menu item được chn…(tt)
fiCác thông đip ca menu:
§WM_MENUSELECT: phát sinh khi user tác
động lên menu. Thông đip này cóthdùng để
cp nht trng thái ca menu (trường hp menu
thay đổi theo ngcnh Context-sensitive
Menu)
fiHàm x lý tương ng: CWnd::OnMenuSelect
fiwParam:
§LOWORD(wParam): ID ca menu item hoc index ca
menu popup
§HIWORD(wParam): các thông tin khác (trng thái menu, loi
menu, …)
filParam: handle ca menu
24
Spring 2004C4W -VisualC++ (MFC) -Nguyen Tri Tuan -DH.KHTN Tp.HCM47
Xlý menu -X lý khi menu item được chn…(tt)
fiCác thông đip ca menu: (tt)
§WM_COMMAND: phát sinh khi user chn 1
menu item
fiHàm x lý tương ng: CWnd::OnCommand
fiwParam:
§LOWORD(wParam): ID ca menu item hoc ca control
§HIWORD(wParam): ngun gc phát sinh, 1 nếu sinh ra do 1
phím tt; 0 nếu chn trc tiếp tmenu
filParam:
§NULL nếu message này phát sinh tmenu
§Nếu message phát sinh t1 control, lParam scha handle
ca control đó
Spring 2004C4W -VisualC++ (MFC) -Nguyen Tri Tuan -DH.KHTN Tp.HCM48
Xlý menu -X lý khi menu item được chn…(tt)
fiXlý lnh ca menu item
§Da 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 phn x lý cho menu item tương ng
void CMainFrame::OnMyFileOpen () {
// Thc hin thao tác mfile
}
void CMainFrame::OnMyFileExit () {
PostMessage (WM_CLOSE, 0, 0);
}
25
Spring 2004C4W -VisualC++ (MFC) -Nguyen Tri Tuan -DH.KHTN Tp.HCM49
Xlý menu -X lý khi menu item được chn…(tt)
fiNhóm lnh (Command range)
§Là1 nhóm menu item hot động theo nguyên
tc “Chcó1 phn t được chn ti 1 thi đim”
§VD. Chc năng vhình “Line / Circle /
Rectangle”
§Cách thc xlý ?
fiCách 1: map tt cxlý ca các menu item này vào
chung 1 hàm x
fiCách 2: dùng macro ON_COMMAND_RANGE
Spring 2004C4W -VisualC++ (MFC) -Nguyen Tri Tuan -DH.KHTN Tp.HCM50
Xlý menu -X lý khi menu item được chn…(tt)
fiNhóm lnh (Command range) (tt)
§Cách 1: map tt cxlý ca các menu itemy
vào chung 1 hàm x
// Đị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 xlý chung, xác định item hin hành
void CMainFrame::OnDraw () {
m_nCurrentDraw =
(UINT) LOWORD(GetCurrentMessage()->wParam);
}