欢迎访问 生活随笔!

ag凯发k8国际

当前位置: ag凯发k8国际 > 编程语言 > c/c >内容正文

c/c

vc 动态创建和删除菜单(转) -ag凯发k8国际

发布时间:2024/10/8 c/c 0 豆豆
ag凯发k8国际 收集整理的这篇文章主要介绍了 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消息映射入口,在程序需要时动态的装入菜单即可。

转载于:https://www.cnblogs.com/juhuahe/archive/2011/01/24/1942797.html

总结

以上是ag凯发k8国际为你收集整理的vc 动态创建和删除菜单(转)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得ag凯发k8国际网站内容还不错,欢迎将ag凯发k8国际推荐给好友。

网站地图