菜单笔记

 


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);

你可能感兴趣的:(c,框架,UI,String,command,menu)