Как поставить галочку в пункте меню, в котором есть пункты подменю.(Visual studio 2008 C ++ / MFC) - PullRequest
2 голосов
/ 04 августа 2010

У меня есть меню, которое содержит подменю.

Например:

  • Item1
  • Item2
  • Item3
    • itemA
    • Элемент B

Item3 содержит элементы под ним.

В любой момент времени 1, 2 или элементы под 3 должныбыть провереннымПоскольку у меня нет идентификатора для Item3, я должен использовать индикатор MF_BYPOSITION, когда пытаюсь установить флажок для Item3, чтобы указать, что у одного из его дочерних элементов есть галочка.Item3 должен иметь галочку, если отмечены A или B.Я могу проверить пункты 1 и 2 и A и B, но не могу понять пункт 3.

Я не смог успешно использовать ::CheckMenuItem() или ModifyMenu() для установки галочки.

Может кто-нибудь указать мне пример, который делает это успешно?Документы, кажется, указывают, что это может быть сделано, но я не смог сделать это.

РЕДАКТИРОВАТЬ

Это для меню, которое установлено как меню для поля dlg.Строка меню состоит из трех пунктов, один из которых опускается до показанного выше.

Обратите внимание, что он используется как всплывающее окно для щелчка правой кнопкой мыши, но я приму любые предложения для работы в любом случае.

Ответы [ 2 ]

2 голосов
/ 04 августа 2010

Я делал это раньше для всплывающих меню.Вам нужно будет получить доступ к подменю по позиции, а не по ID.Используя ваш пример выше, пункт 3 будет в позиции 2:

CMenu popupMenu;
popupMenu.LoadMenu(IDR_MYMENU);
popupMenu.GetSubMenu(0)->CheckMenuItem(2,MF_BYPOSITION|MF_CHECKED);
.
.
.
popupMenu.GetSubMenu(0)->TrackPopupMenu(...);

Однако я не делал этого с элементами в строке меню.1006 *

Для полноты

Чтобы заставить его работать с элементом меню, нужно получить hmenu

// MENU_POSITION is the zero based location of the menu you want to use. (file, edit, view, help... etc)
HMENU mainMenu = ::GetMenu(m_hWnd);
HMENU subMenu = GetSubMenu( mainMenu, MENU_POSITION);
SetMenuState(subMenu);
1 голос
/ 07 августа 2012

Несколько мгновений назад у меня возникла похожая проблема - стандартная строка меню MFC, содержащая хотя бы одно подменю, и необходимость иметь возможность добавить галочку в родительский элемент подменю , когда любой изэлементы подменю child проверены.

Самое простое (для меня) решение оказалось таким же простым, как выполнение обновления в стандартном вызове OnUpdateMenuItem (CCmdUI * pCmdUI).В моем случае я использовал ON_UPDATE_COMMAND_UI_RANGE () для подачи набора идентификаторов меню в один и тот же вызов обновления, но принципал одинаков для одной карты ON_UPDATE_COMMAND_UI ().

Код, который я использовал (отредактированный, чтобы большелегко вставляется в работу других людей):

void CMyApp::OnUpdateMenu(CCmdUI* pCmdUI)
{
   // Note, a submenu parent (which has no editable ID in the resource editor) has the SAME ID as the first child item
   if (pCmdUI->m_nID == ID_FIRST_CHILD_MENU && pCmdUI->m_pSubMenu != NULL) {
      // Get the child menu so we can see if any child items are checked
      CMenu* pSubMenu = pCmdUI->m_pSubMenu;
      BOOL fChildChecked = FALSE;
      for (UINT i = 0; !fChildChecked && i < pSubMenu->GetMenuItemCount(); ++i) {
         // Do something to decide if this child item should be checked...
         UINT nChildID = pSubMenu->GetMenuItemID(i);
         fChildChecked = IsThisChildChecked(nChildID);
      }

      // The POSITION of the current menu item is stored in pCmdUI->m_nIndex
      CMenu* pMenu = pCmdUI->m_pMenu;
      UINT flags = MF_BYPOSITION;
      if (fActiveChild) flags |= MF_CHECKED;
      pMenu->CheckMenuItem(pCmdUI->m_nIndex, flags);
   }

   // Set the enabled state of the menu item as you see fit...
   pCmdUI->Enable(TRUE);
}

Et voilà элемент подменю автоматически получает отметку, когда любой из его дочерних пунктов меню имеет отметку.

Надеюсь, это поможет другим, ищущим подобные решения!

Джон

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...