问题描述
在程序运行时,往一个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();
说明:以上方法,自己试验可以使用,可能有其他更好的方式。