基于VS2010的MFC动态菜单

34 篇文章 0 订阅

1、创建菜单资源

新建IDR_DYNAMIC_MENU,制作如下菜单,其中“动态菜单1”,“动态菜单2”的属性popup为false,并设定ID为ID_DYNAMIC_ITEM1和ID_DYNAMIC_ITEM2,中间的分隔符在Caption属性中输入"-",并设置popup为false,separator为true。

为系统菜单添加一个类似placeholder的菜单项,其Caption,ID,popup类型如图所示。

2、添加菜单单击事件处理

在菜单右键选择添加事件处理程序

在打开的事件处理对话框中,选择事件处理的类为CMainFrame,消息类型为COMMAND,处理函数的名字为OnDynamicMenuItem1

按照同样的方式添加处理函数OnDynamicMenuItem2事件处理程序

3、添加事件处理代码


/// <summary>	Executes the dynamic menu item 1 action. </summary>
///
/// <remarks>	zhengzhe, 2011/10/23. </remarks>


void CMainFrame::OnDynamicMenuItem1()
{
	// TODO: 在此添加命令处理程序代码
	AfxMessageBox(_T("Dynamic menu item 1 clicked"));
}


/// <summary>	Executes the dynamic menu item 2 action. </summary>
///
/// <remarks>	zhengzhe, 2011/10/23. </remarks>


void CMainFrame::OnDynamicMenuItem2()
{
	// TODO: 在此添加命令处理程序代码
	AfxMessageBox(_T("Dynamic menu item 2 clicked"));
}
4、为CMainFrame类添加OnShowPopupMenu重载函数

在类视图中,选择CMainFrame类,右键打开类向导,选择虚函数选项卡,选择OnShowPopupMenu,并单击添加函数,然后编辑。


BOOL CMainFrame::OnShowPopupMenu (CMFCPopupMenu* pMenuPopup)
{
	//---------------------------------------------------------
	// Replace ID_VIEW_TOOLBARS menu item to the toolbars list:
	//---------------------------------------------------------
	CMDIFrameWndEx::OnShowPopupMenu(pMenuPopup);

	if (pMenuPopup == NULL)
	{
		return TRUE;
	}

	if (pMenuPopup->GetMenuBar ()->CommandToIndex (ID_VIEW_TOOLBARS) >= 0)
	{
		if (CMFCToolBar::IsCustomizeMode ())
		{
			//----------------------------------------------------
			// Don't show toolbars list in the cuztomization mode!
			//----------------------------------------------------
			return FALSE;
		}

		pMenuPopup->RemoveAllItems ();

		CMenu menu;
		VERIFY(menu.LoadMenu (IDR_POPUP_TOOLBAR));

		CMenu* pPopup = menu.GetSubMenu(0);
		ASSERT(pPopup != NULL);

		if (pPopup)
		{
			pMenuPopup->GetMenuBar ()->ImportFromMenu (*pPopup, TRUE);
		}
	}

	//------------- Example --------------------//

	// 通过CommandToIndex方法查找资源号为ID_DYNAMIC_COMMANDS的 {Dynamic Command} 菜单项
	// 它将被替换为我们的动态菜单项
	// 在用户自定义模式下我盟保留这个菜单
	int iIndex = -1;
	if (!CMFCToolBar::IsCustomizeMode () &&
		(iIndex = pMenuPopup->GetMenuBar ()->CommandToIndex (ID_DYNAMIC_COMMANDS)) >= 0)
	{
		//在非自定义模式下,移除 {Dynamic Command} 菜单项
		pMenuPopup->RemoveItem (iIndex);

		pMenuPopup->InsertSeparator (iIndex); // 在最后插入一个分隔符
		// IDS_EDIT_MYITEM_1 and IDS_EDIT_MYITEM_1 在String表中定义了2个字符串IDS_EDIT_MYITEM_1和IDS_EDIT_MYITEM_2
		// for status text and tooltip
		pMenuPopup->InsertItem (
			CMFCToolBarMenuButton (IDS_EDIT_MYITEM_1, NULL, -1, _T("&MyItem 1")), iIndex + 1);
		pMenuPopup->InsertItem (
			CMFCToolBarMenuButton (IDS_EDIT_MYITEM_2, NULL, -1, _T("MyItem &2")), iIndex + 2);

		//不要忘了在消息映射中添加消息处理(ON_COMMAND) 
	}
	
	//-------------------------------------------//
	
	return TRUE;
}

6、添加未能自动生成的消息映射

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	……
	ON_COMMAND(IDS_EDIT_MYITEM_1, OnEditMyItem1)
	ON_COMMAND(IDS_EDIT_MYITEM_2, OnEditMyItem2)
END_MESSAGE_MAP()


添加StringTable中得动态菜单字符串名称

7、在CMainFrame的OnCreate方法中注册Command

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	……

	m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC);

	//------------- Example --------------------//
	// 在自定义模式下不要允许修改这些哑菜单(dummy item)
	CList<UINT, UINT> lstProtectedCmds;
	lstProtectedCmds.AddTail (ID_DYNAMIC_COMMANDS);
	CMFCToolBarButton::SetProtectedCommands (lstProtectedCmds);
	//-----------------------------------------//
}
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值