资源描述:
《动态添加菜单项、子菜单、右键菜单 vc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、动态添加菜单项、子菜单、右键菜单VC动态添加菜单项、子菜单、右键菜单(VC)2010-06-2716:56如何动态添加菜单/菜单项、子菜单、右键菜单有关菜单的操作主要用到CMenu类,当然也可用相应API函数,CMenu类只是MFC对API中操作菜单的函数的封装而已。不过能用类就尽量用类,类的组织方式好呗,代码看着也舒服。若是SDK编程,那就用API吧。CMenumenuMain,menu1;//首先定义CMenu对象一、创建菜单,有两种方法1.用LoadMenu函数从资源加载menuMain.LoadMenu(IDR_MAINFRAME);//从资源加载,这里使用SDI的主菜单资源2.用C
2、reateMenu函数创建menu1.CreateMenu();//创建菜单,还没有菜单项二、添加菜单项,可用AppendMenu()在菜单的最后加、InsertMenu()在指定的位置加.//ID_TEST1在Resource.h中定义,随便给个整数值,不要和已有的重复就行了menu1.AppendMenu(MF_STRING,ID_TEST1,"Test1");//第一项菜单项menu1.AppendMenu(MF_STRING,ID_TEST2,"Test2");//第二项菜单项menu1.InsertMenu(1,MF_BYPOSITION
3、MF_STRING,(UINT)ID_TE
4、ST1,"ID_TEST1");//在第二项菜单项前添加新菜单项三、添加子菜单同样用AppendMenu()、InsertMenu()函数。不过要注意参数的设置。menu1.AppendMenu(MF_BYPOSITION
5、MF_POPUP
6、MF_STRING,(UINT)menuMain.GetSubMenu(0)-m_hMenu,"子菜单");//第二个参数是菜单的句柄HMENU四、删除菜单用DeleteMenu()、RemoveMenu()函数来删除指定位置的菜单/菜单项。两者区别:如果菜单项是一个弹出式菜单,那么DeleteMenu和RemoveMenu之间的区别就很重要。Delet
7、eMenu清除弹出式菜单,但RemoveMenu不清除它。一个是彻底的删除,一个只是移除.MSDN:1.TheDeleteMenufunctiondestroysthehandletothemenuorsubmenuandfreesthememoryusedbythemenuorsubmenu.它使菜单或者子菜单的handle无效(destroys)。2.RemoveMenudoesnotdestroythemenuoritshandle,allowingthemenutobereused.可以再利用,并不从内存中将menu删除。五、添加右键菜单CMenumenu1;menu1.Create
8、PopupMenu();//动态创建弹出式菜单对象menu1.AppendMenu(MF_STRING,ID_TEST1,"菜单项1");menu1.AppendMenu(MF_STRING,ID_TEST2,"菜单项2");menu1.InsertMenu(2,MF_BYPOSITION
9、MF_POPUP
10、MF_STRING,(UINT)menuMain.m_hMenu,"子菜单");//添加子菜单CPointpt;GetCursorPos(&pt);menu1.TrackPopupMenu(TPM_RIGHTBUTTON,pt.x,pt.y,this);menu1.DestroyMenu
11、();六、响应菜单的事件1.若是资源中添加的菜单可用ClassWizard添加菜单的响应事件。2.若是通过代码创建的菜单,要手工实现菜单的消息映射。本例是在CmainFrame类中,当然也可在View类、Doc类中,基于对话框的同样也可以。1)在.h文件中//Generatedmessagemapfunctionsprotected://{{AFX_MSG(CMainFrame)afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct);afx_msgvoidOnChangmenuitem();//这里添加菜单命令处理函数的声明//}}AFX_MSGDE
12、CLARE_MESSAGE_MAP()2)在.cpp文件中,BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)//{{AFX_MSG_MAP(CMainFrame)ON_WM_CREATE()ON_COMMAND(IDM_CHANGMENUITEM,OnChangmenuitem)//这里添加,注意没有';'//}}AFX_MSG_MAPEND_MESSAGE_MAP()voidC