VC++动态加入和删除菜单的方法

在应用程序中,往往要根据当前的操作来增加相应的菜单。动态增加菜单的方法有多 
种,本文只讲述利用资源编辑器预创建菜单资源,然后在程序运行中动态加入(或删 
除)到主菜单中去的方法。<br< div="" style="margin: 0px; padding: 0px; font-family: Arial, Helvetica, 宋体; color: rgb(68, 68, 68); line-height: 21.6000003814697px;">
在应用程序中,往往要根据当前的操作来增加相应的菜单。动态增加菜单的方法有多 
种,本文只讲述利用资源编辑器预创建菜单资源,然后在程序运行中动态加入(或删 
除)到主菜单中去的方法。 
一、用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消息映射入口,在程序需要时动态的装入菜单即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值