wtl单文档选项_MFC 单文档中动态添加菜单项和响应菜单事件

本文介绍如何在MFC单文档程序中动态添加菜单项,并响应菜单事件。通过修改资源文件,添加消息映射,实现隐藏/显示工具栏、创建新菜单项以及处理右键菜单的功能。同时,利用OnCommand消息映射处理动态添加的子菜单项的点击事件。
摘要由CSDN通过智能技术生成

新建一个单文档程序

在查看菜单项中增加两个子菜单,分别为隐藏工具栏(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("右键菜单"));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值