MFC中Ribbon按钮动态增加子菜单,无法响应事件

问题描述

在程序运行时,往一个CMFCRibbonButton中增加子项,子项又是一个CMFCRibbonButton时,这个子项按钮点击没有响应。代码如下:


//其中pUserCenterButton是加入到Ribbon的右侧Tab中的按钮项

//切换账号按钮
CMFCRibbonBaseElement* pChangeUser = new CMFCRibbonButton(ID_BUTTON_CHANGE_USER, _T("切换账号"));
pUserCenterButton->AddSubItem(pChangeUser);
m_wndRibbonBar.ForceRecalcLayout();

原因分析

查看MFC源码,原来是因为这个子项按钮没有设置父RibbonBar,点击时,发现没有父RibbonBar时,就返回了,不会发送通知。子项父RibbonBar会在CMFCRibbonBar::AddToTabs中被设置,但前述代码没有经过AddToTabs,所以没有被设置父RibbonBar。

void CMFCRibbonBar::AddToTabs(CMFCRibbonBaseElement* pElement)
{
	ASSERT_VALID(this);
	ASSERT_VALID(pElement);

	pElement->SetParentRibbonBar(this);
	pElement->m_bIsTabElement = TRUE;
	m_TabElements.AddButton(pElement);

	if (m_nSystemButtonsNum > 0)
	{
		// Move the new element prior to system buttons:
		int nSize = (int)m_TabElements.m_arButtons.GetSize();

		m_TabElements.m_arButtons.RemoveAt(nSize - 1);
		m_TabElements.m_arButtons.InsertAt(nSize - m_nSystemButtonsNum - 1, pElement);
	}
}

解决方案

手动调用SetParentRibbonBar,将子项按钮设置好父RibbonBar。

//切换账号按钮
CMFCRibbonBaseElement* pChangeUser = new CMFCRibbonButton(ID_BUTTON_CHANGE_USER, _T("切换账号"));
pChangeUser->SetParentRibbonBar(&m_wndRibbonBar);
pUserCenterButton->AddSubItem(pChangeUser);
m_wndRibbonBar.ForceRecalcLayout();

说明:以上方法,自己试验可以使用,可能有其他更好的方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC(Microsoft Foundation Class)是由Microsoft开发的一套用于编写Windows程序的类库。Ribbon菜单MFC的一种界面风格,可用于创建现代化、富有交互性的用户界面。 Ribbon菜单的特点是具有直观的用户界面,其通过使用带有大型按钮和工具栏的标签式布局来增强程序的可用性和可操作性。Ribbon菜单可以在一个窗口内展示多个选项卡,每个选项卡上都可以放置多个按钮,且可以自定义按钮的布局和样式。这使得用户能够快速访问各种功能,并且可以通过单击按钮来执行特定的操作。 Ribbon菜单提供了一个集管理和展示功能的心,用户可以轻松地在不同的选项卡之间切换,并直观地了解当前所使用功能的状态。它还支持键盘快捷键和鼠标手势等交互方式,从而提高了用户的操作效率。 从开发者的角度来看,使用MFC Ribbon菜单可以简化界面的设计和开发过程。MFC提供了一系列的类和函数,用于创建和管理Ribbon菜单按钮、选项卡等控件。开发者可以通过调用相应的函数来直接添加和配置这些控件,而无需手动绘制界面。同时,MFC还提供了响应控件事件的接口和函数,开发者可以通过编写相应的代码来实现功能的处理。 总之,MFC Ribbon菜单提供了一种现代化和直观的用户界面,适用于开发各种Windows程序。它可以提高用户的操作效率和体验,同时也简化了开发者的界面设计和开发工作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值