MFC中动态添加菜单项和响应菜单事件

来源:互联网 发布:零基础学大数据算法pdf 编辑:程序博客网 时间:2024/05/17 22:10
 

新建一个单文档程序

在查看菜单项中增加两个子菜单,分别为隐藏工具栏(ID_HIDE),新建菜单(ID_NEWMENU)

在Resource.h中增加一个ID_NEWMENU宏

#define ID_NEWMENU        WM_USER+101

 

操作工具栏和状态栏

使用GetDescendantWindow函数获取工具栏和状态栏的指针

为ID_HIDE添加消息映射,编辑代码如下

 static bool m_Hide=false; 
 m_Hide=!m_Hide;
 //获取工具栏指针 
 CWnd* pWndToolBar=(CWnd*)GetDescendantWindow(AFX_IDW_TOOLBAR);
 //获取状态栏指针 
 CWnd* pWndStatusBar=(CWnd*)GetDescendantWindow(AFX_IDW_STATUS_BAR);
 CMenu* pMenu=GetMenu();
 CMenu* pSubMenu=pMenu->GetSubMenu(2);
 if(m_Hide) 
 {
 pSubMenu->ModifyMenu(ID_HIDE,MF_BYCOMMAND,ID_HIDE,"显示工具栏"); 
 if(pWndStatusBar!=NULL) pWndStatusBar->SetWindowText("隐藏工具栏"); 
 if(pWndToolBar!=NULL) pWndToolBar->ShowWindow(SW_HIDE); 
 }
 else 
 {
 pSubMenu->ModifyMenu(ID_HIDE,MF_BYCOMMAND,ID_HIDE,"隐藏工具栏"); 
 if(pWndStatusBar!=NULL) pWndStatusBar->SetWindowText("显示工具栏"); 
 if(pWndToolBar!=NULL) pWndToolBar->ShowWindow(SW_SHOW); 
 }

 

动态添加子菜单

为ID_NEWMENU增加消息映射,编辑代码如下

 static UINT m_NewMenu=ID_NEWMENU+1; 
 //获取菜单 
 CMenu* pMenu=GetMenu();
 //获取索引为2的菜单项,即第3列菜单 
 CMenu* pSubMenu=pMenu->GetSubMenu(2);
 char buffer[1]; 
 itoa(m_NewMenu-ID_NEWMENU,buffer,10);
 if(m_NewMenu<=ID_NEWMENU+5) 
 {
 pSubMenu->AppendMenu(MF_SEPARATOR); //分隔线 
 pSubMenu->AppendMenu(MF_STRING | MF_ENABLED,m_NewMenu++,
 CString("新的菜单 ")+buffer);  
 }
 //如果m_bAutoMenuEnable为true,则会依次检查View、Document、Frame的 
 //消息映射表是否有这个弹出菜单中每个菜单项的处理函数,如果没有就会把那一项改为灰的  
 m_bAutoMenuEnable=false; 

 

添加OnCommand的消息映射用来响应添加的子菜单项,代码如下

UINT uMsg=LOWORD(wParam);
 for(UINT i=ID_NEWMENU+1;i<=ID_NEWMENU+5;i++) 
 if(uMsg==i) 
 {
 char buffer[1]; 
 itoa(i-ID_NEWMENU,buffer,10);
 MessageBox(CString("新的菜单 ") + buffer); 
 }

 

右键菜单

在View类中添加OnRButtonDown的消息映射,代码如下

 CMenu pPopMenu;
 pPopMenu.CreatePopupMenu();
 if(pPopMenu==NULL); 
 pPopMenu.AppendMenu(MF_STRING,ID_NEWMENU+6,"右键菜单"); 
 this->ClientToScreen(&point); 
 pPopMenu.TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this); 

 

在View类中添加OnCommand的消息映射用来响应右键菜单的事件

UINT uMsg=LOWORD(wParam);
 if(uMsg==ID_NEWMENU+6) 
 MessageBox(CString("右键菜单"));