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();

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值