Mfc 如何为功能区按钮创建动态菜单?
我知道如何使用以下代码为按钮生成静态菜单项:Mfc 如何为功能区按钮创建动态菜单?,mfc,ribbon,Mfc,Ribbon,我知道如何使用以下代码为按钮生成静态菜单项: CBCGPRibbonCategory *pCategory = ...; CBCGPRibbonPanel *pPanel = pCategory->AddPanel(_T("Panel Name"), hPanelIcon); HMENU hMenu = CreateMenu(); AppendMenu(hMenu, MF_STRING, ID_ITEM_1, _T("Item 1")); AppendMenu(hMenu, MF_STR
CBCGPRibbonCategory *pCategory = ...;
CBCGPRibbonPanel *pPanel = pCategory->AddPanel(_T("Panel Name"), hPanelIcon);
HMENU hMenu = CreateMenu();
AppendMenu(hMenu, MF_STRING, ID_ITEM_1, _T("Item 1"));
AppendMenu(hMenu, MF_STRING, ID_ITEM_2, _T("Item 2"));
CBCGPRibbonButton * pButton = new CBCGPRibbonButton(ID_BUTTON_WITH_MENU, _T(""))
pButton->SetMenu(hMenu, TRUE); // for dynamic
pPanel->Add(pButton);
但是如果我想要菜单是动态的,我该怎么办?我试图通过覆盖ShowPopupMenu()上的并更改我附加到该按钮的Humenu
来修改原始Humenu
,但没有成功
通过创建菜单并使用TrackPopupMenu()
函数,我可以在按钮下强制创建菜单,但样式错误。(看起来是灰色而不是白色以及其他一些区别)
编辑
为了解决这个问题,我做了以下工作:
class CDynamicMenuButton : public CBCGPRibbonButton
{
public:
CDynamicMenuButton(
UINT nID,
LPCTSTR lpszText,
int nSmallImageIndex = -1,
int nLargeImageIndex = -1,
BOOL bAlwaysShowDescription = FALSE)
: CBCGPRibbonButton(nID, lpszText, nSmallImageIndex, nLargeImageIndex, bAlwaysShowDescription)
{
SetMenu(CreatePopupMenu());
}
void OnShowPopupMenu() override
{
// legacy code to generate menu
CMenu newMenu;
populateMenu(&newMenu);
// sets the new menu
SetMenu(newMenu);
// Pops up the new menu
CBCGPRibbonButton::OnShowPopupMenu();
}
};
将此按钮添加到面板将生成我想要的动态菜单。功能区似乎只使用humenu
作为模板来构建自己的结构,因此修改humenu
是徒劳的。更好地使用现有的功能区菜单按钮:
pBtn->RemoveAllSubItems(); // add a dummy hMenu when creating the menu button in CMainFrame!
std::auto_ptr<CMFCRibbonButtonEx> apBtn3(new CMFCRibbonButtonEx(ID_DYNAMIC_MENU_ITEM_3, "Item 3", -1, -1, true));
pBtn->AddSubItem(apBtn.release());
std::auto_ptr<CMFCRibbonButtonEx> apBtn4(new CMFCRibbonButtonEx(ID_DYNAMIC_MENU_ITEM_4, "Item 4", -1, -1, true));
pBtn->AddSubItem(apBtn.release());
pBtn->RemoveAllSubItems();//在CMainFrame中创建菜单按钮时添加一个虚拟菜单!
std::auto_ptr apBtn3(新的CMFCRibbonButtonNex(ID_DYNAMIC_菜单_ITEM_3,“ITEM 3”,-1,-1,true));
pBtn->AddSubItem(apBtn.release());
std::auto_ptr apBtn4(新的CMFCRibbonButtonNex(ID_DYNAMIC_菜单_项4,“项4”,-1,-1,true));
pBtn->AddSubItem(apBtn.release());
但是请确保在代码中的正确位置更新菜单。更改CMyView::OnUpdate()中的菜单被证明不是一个好主意()。如果在打开MDI文档时需要修改菜单,请考虑<代码> OnPrimalUpDeDeO()/<代码>。我还没有尝试过oncmdmdmsg()
也许通过CMFCRibbonBar::FindByID()
获取pBtn就足够了,但迭代CMFCRibbonBar::GetElementsByID
并更改找到的每个菜单按钮(即,也修改快速访问工具栏?)可能是正确的选择。。。我发现文档并不是很具体,但在我的代码中,通过“FindByID”修改似乎就足够了
如果您对动态功能区菜单有任何进一步的了解,请给我留言。谢谢。我需要的是一个懒惰的动态菜单。即,当调用菜单时,我希望生成它。我打算在showPopupMenu()上尝试生成它,但这会阻止菜单弹出。我怎么才能强迫菜单出现?啊,明白了。我只需调用showPopupMenu()上的父成员函数
。再次感谢。武力不会把你带到任何地方。OnShowPopupMenu指的是您的C(MDI)FrameWndEx中被分解的Humenu。它死了,巫术也帮不了你。您现在需要处理CMFCRibbonBar
,它必须放弃旧的CMenu,以使功能区的所有优秀功能成为可能。对不起,据我所知,没有懒惰的方法来构建菜单。如果您找到了,请告诉我。我刚刚在showPopupMenu()中构建了菜单
覆盖(在我的情况下,由于遗留代码,我使用了一个CMenu)。然后我调用了基类的OnShowPopupMenu()
和volia!它弹出了新生成的菜单!:但这不是功能区菜单,不是吗?