Chinaunix首页 | 论坛 | 博客
  • 博客访问: 570520
  • 博文数量: 97
  • 博客积分: 5090
  • 博客等级: 大校
  • 技术积分: 969
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-01 14:56
文章分类

全部博文(97)

文章存档

2011年(1)

2009年(1)

2008年(14)

2007年(37)

2006年(44)

我的朋友

分类: WINDOWS

2007-04-18 13:20:44

VC++动态加入和删除菜单的方法  
   
  在应用程序中,往往要根据当前的操作来增加相应的菜单。动态增加菜单的方法有多  
  种,本文只讲述利用资源编辑器预创建菜单资源,然后在程序运行中动态加入(或删  
  除)到主菜单中去的方法。  
  一、用AppWizard建立一个单文档工程,默认一切选项。在WorkSpace(工作空间)的  
  ResourecView页中右击Menu资源,加入一个新的菜单,其ID为:IDR_MENU1。为  
  IDR_MENU1加入一个菜单项和相应的子菜单。如(图一)所示。  
  二、编辑IDR_MAINFRAME菜单(ID为IDR_MAINFRAME的菜单一般均为主菜单),在【查看  
  (V)】菜单项下面增加二个子菜单项。如(图二)所示。其属性如下:  
  ID  
  Caption  
  IDC_ADD  
  加入菜单  
  IDC_DELETE  
  删除菜单  
  三、要访问要菜单,可使用CWnd类的GetMenu()成员函数、或使用全局函数  
  AfxGetMainWnd()―>GetMenu(),它们都返回一个CMenu对象的指针。一旦得到Cmenu指  
  针,就可以对菜单进行各种操作(装入、增加、插入,删除,更新等等)。通过Cmenu  
  指针对菜单进行操作后,应使用Cmenu类的Detach()成员函数从Cmenu对象中分离出菜  
  单,避免发生冲突。之后调用CWnd::DrawMenuBar()重画菜单。  
  四、为实现加入、删除操作,我们用“ClassWizard”向导为IDC_ADD和IDC_DELETE增加  
  两个COMMAND消息映射函数,它们分别为CMainFrame::OnAdd()   和  
  CMainFrame::OnDelete()。接着我们为其编写代码如下:  
  void   CMainFrame::OnAdd()   //加入菜单操作。  
  {    
  CMenu   addmenu,*mainmenu;    
  if(!addmenu.LoadMenu(IDR_MENU1))   //装入菜单资源。    
  {    
  MessageBox("菜单装入失败!","错误",MB_OK|MB_ICONERROR);    
  return;   //如装入失败,显示消息框,且返回。    
  }    
  CString   str="颜色(&C)";   //要增加的菜单项的标签。    
  mainmenu=AfxGetMainWnd()->GetMenu();    
  //取得指向窗口菜单的Cmenu对象的指针。    
  mainmenu->InsertMenu   (1,MF_POPUP|MF_BYPOSITION|MF_STRING,    
  (UINT)addmenu.GetSubMenu(0)->   m_hMenu,str);    
  //将弹出式菜单插入到第2项菜单之前(菜单项从0开始计算)。    
  //   addmenu.GetSubMenu(0)->   m_hMenu是被装入菜单的第一个菜单项的弹出式菜单的菜单句柄。    
  mainmenu->Detach();   //将窗口菜单与Cmenu对象分离。    
  addmenu.Detach();   //将资源菜单(IDR_MENU1)与Cmenu对象分离。    
  DrawMenuBar();   //重画菜单。    
  }    
   
  Cmenu::InsertMenu的函数原形如下:    
  BOOL   InsertMenu(   UINT   nPosition,   UINT   nFlags,   UINT   nIDNewItem   =   0,   LPCTSTR   lpszNewItem   =   NULL   );    
  参数   nPosition:指定在那个菜单项前插入新菜单项。被参数nFlags用于以下列方式解释nPosition    
   
   
  NFlags参数    
  NPosition参数的解释    
  MF_BYCOMMAND    
  指定参数给出巳存在的菜单项的命令ID号。此为缺省值。    
  MF_BYPOSITION    
  指定参数给出巳存在的菜单项的位置。第一项位于位置0。如果Nposition为-1,新菜单将添加到菜单尾。    
  参数   nFlags:指定Nposition、nIDNewItem、lpszNewItem值如何被解释。    
  参数   nIDNewItem:指定新菜单项的命令ID号,或者,若nFlags被设置为MF_POPUP,则指定为弹出菜单的菜单句柄(HMENU)。若nFlags被设置为MF_SEPARATOR,那么参数nIDNewItem将被忽略。    
  参数   lpszNewItem:指定新菜单项的文本。被nFlags以下列方式解释    
  NFlags参数    
  LpszNewItem的解释    
  MF_STRING    
  包含指向以空格位终止符的字符串指针。它为缺省解释。    
  MF_SEPARATOR    
  参数将被忽略。    
   
  void   CMainFrame::OnDelete()   //删除菜单操作。    
  {    
  CMenu   *m  
  ainmenu;  
  CString   str;  
  mainmenu=GetMenu();   //取得指向窗口菜单的Cmenu对象的指针。  
  for(int   i=mainmenu->GetMenuItemCount()-1;i>=0;i--)   //取得菜单的项数。  
  {    
  mainmenu->GetMenuString(i,str,MF_BYPOSITION);    
  //将指定菜单项的标签拷贝到指定的缓冲区。MF_BYPOSITION的解释见上。    
  if(str=="颜色(&C)")   //如果是刚才我们增加的菜单项,则删除。    
  {    
  mainmenu->DeleteMenu(i,MF_BYPOSITION);    
  break;    
  }    
  }    
  mainmenu->Detach();   //将窗口菜单与Cmenu对象分离。    
  DrawMenuBar();   //重画菜单。    
  }    
  五、编译,运行程序,看看到底是怎样的!用这种方法动态增加菜单有它的好处:即我们可以事先为菜单ID编写好COMMAND、UPDATE_COMMAND_UI消息映射入口,在程序需要时动态的装入菜单即可。  
阅读(1239) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~