Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mfc 如何为功能区按钮创建动态菜单?_Mfc_Ribbon - Fatal编程技术网

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!它弹出了新生成的菜单!:但这不是功能区菜单,不是吗?