Редактирование меню динамической кнопки интерфейса ленты

У меня есть приложение с ленточным интерфейсом. В этом интерфейсе существует кнопка с прикрепленным к ней меню. Я хочу получить доступ к меню из обработчика кнопок для динамического добавления и удаления пунктов меню.

void
CMyScrollView::OnMenuButtonHandler ()
{
  // TODO: Add your command handler code here
  CMFCRibbonBar *pRibbon  = ((CMDIFrameWndEx*)GetTopLevelFrame())GetRibbonBar()
  // Control ID_BTN_EDIT_MENU
  // This where I would like to isolate and vary menu contents
}

1 ответ

Решение

В окне CMainFRame создайте обработчик для сообщения AFX_WM_ON_BEFORE_SHOW_RIBBON_ITEM_MENU (ON_Rurable_MESSAGE).

Проверьте идентификатор кнопки. Удалите все предыдущие элементы и добавьте тот, который вы хотите.

LRESULT CMainFrame::OnBeforeShowRibbonItemMenu(WPARAM,LPARAM lp)
{
  CMFCRibbonBaseElement *pElement = reinterpret_cast<CMFCRibbonBaseElement*>(lp);

  // Try to get our menu button
  switch (pElement->GetID())
  {
    case ID_RIBBON_DROPDOWN_BUTTON:
    {
      CMFCRibbonButton *pButton = DYNAMIC_DOWNCAST(CMFCRibbonButton, pElement);
      if (pButton)
      {
        // MY_LIST copntains members with the ID and the text: m_uiCmdId, m_strTitle
        const MY_LIST &list = ....;
        if (list.size()!=0)
        {
          pButton->RemoveAllSubItems();

          for (it = list.begin(); it!=list.end(); ++it)
            pButton->AddSubItem(new CSomeKindOfRibbonButton(it->m_uiCmdId, it->m_strTitle));
        }
      }
 ...
Другие вопросы по тегам