1. 响应单个命令
ON_COMMAND(ID_MENU_OPEN, OnOpenFile)
void CMenuDlg::OnOpenFile()
{
MessageBox(_T("x"));
}
2. 响应连续的命令
ON_COMMAND_RANGE(ID_MENU_COPY, ID_MENU_CUT, OnOrderCom)
// 命令项的连续处理
void CMenuDlg::OnOrderCom(UINT nID)
{
TCHAR szBuf[50] = {0};
wsprintf(szBuf, _T("%d"), nID); // ID_MENU_COPY
MessageBox(szBuf);
}
3. 一些细节
1> 被&的字符, 即为快捷键。顶层菜单Alt + 字符, 子菜单直接按字符
// 加载资源菜单
// m_menu.LoadMenu(IDR_MENU_MAIN);
// SetMenu(&m_menu);
// 动态创建菜单
m_menu.CreateMenu();
m_menu.AppendMenu(MF_STRING, ID_MENU_COPY, _T("复制(&C)"));
m_menu.AppendMenu(MF_STRING, ID_MENU_PASTE, _T("粘贴(&V)"));
m_menu.AppendMenu(MF_STRING, ID_MENU_CUT, _T("剪切(&X)"));
CMenu *pMenu = new CMenu;
pMenu->CreateMenu();
pMenu->AppendMenu(MF_POPUP, (UINT)m_menu.m_hMenu, _T("编辑(&E)")); // ,(UINT)MyMenu1.m_hMenu,"编辑"); )
SetMenu(pMenu);
m_menu.Detach(); // 把m_hMenu释放掉
pMenu->Detach();
2. 在菜单命名中输入"\", 即为Tab的意思.
4. 更新菜单状态
1> ON_UPDATE_COMMAND_UI
ON_UPDATE_COMMAND_UI(ID_SHAPE_CIRCLE, OnUpdateShapeCircle) // 单个菜单项的更新
void CChildView::OnUpdateShapeCircle(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck (m_nShape == 0); // 菜单文字前打钩
pCmdUI->SetRadio (m_nShape == 0); // 菜单文字前标点
}
2> ON_UPDATE_COMMAND_UI_RANGE // 更新范围
ON_UPDATE_COMMAND_UI_RANGE(ID_SHAPE_CIRCLE, ID_SHAPE_SQUARE, OnUpdateShapeCircle)
void CChildView::OnUpdateShapeCircle(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(pCmdUI->m_nID - ID_SHAPE_CIRCLE == m_nShape);
}
5. 删除菜单项
// 获取顶层菜单
CMenu *pMenu = GetMenu(); // 注意要删除的菜单是术语主框架的, 所以不能在View中调用
pMenu->DeleteMenu(1, MF_BYPOSITION);
6. 删除子菜单
// 获取顶层菜单的第1(从0开始的)子菜单
CMenu *pMenu = GetMenu()->GetSubMenu(1);
pMenu->DeleteMenu(0, MF_BYPOSITION); // 通过位置删除
pMenu->DeleteMenu(ID_SHAPE_TRIANGLE, MF_BYCOMMAND); // 通过ID
// 获取顶层菜单
CMenu *pMenu = GetMenu(); // 注意要删除的菜单是术语主框架的, 所以不能在View中调用
pMenu->DeleteMenu(ID_SHAPE_CIRCLE, MF_BYCOMMAND); // 通过ID可以用任意层菜单指针删除
7. 改变菜单项的特性
// 获取顶层菜单
CMenu *pMenu = GetMenu(); // 注意要删除的菜单是术语主框架的, 所以不能在View中调用
// 第3个参数是新的菜单项命令ID, 如果不想改变, 可以保持.
pMenu->ModifyMenu(ID_SHAPE_CIRCLE,
MF_STRING | MF_BYCOMMAND,
ID_SHAPE_CIRCLE, _T("Modify F7"));
8. 修改系统菜单
注意: 往系统菜单中添加的菜单项必须赋有ID, 它们是16的倍数(16、32、48等等).
1. 添加消息映射, 注意只能在主框架中
afx_msg void OnSysCommand(UINT nID, LONG lParam);
WM_ON_SYSCOMMAND()
void CMainFrame::OnSysCommand(UINT nID, LONG lParam)
{
UINT nTmp = (nID & 0xFFF0);
if (nTmp == SC_CLOSE)
{
}
CWnd ::OnSysCommand(nID, lParam);
}
2. 添加系统菜单
// 一般在OnCreate中添加
CMenu *pSysMenu = GetSystemMenu(FALSE);
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, ID_SYSMENU_TEST, _T("Test"));
3. 使其无效
CMenu *pSysMenu = GetSystemMenu(FALSE);
pSysMenu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND | MF_DISABLED);
pSysMenu->DeleteMenu(SC_CLOSE, MF_BYCOMMAND);