2012-04-28 3 views
3

Я пытаюсь получить подменю, чтобы я мог вносить в него изменения до его отображения.Как получить подменю в MFC?

Так что я создал обработчик OnInitMenu() для своего окна. И я планировал использовать pMenu->GetMenuItemInfo(), чтобы получить подменю.

Однако, похоже, это не сработает. Чтобы найти нужное меню, я должен предоставить идентификатор команды меню (я не считаю его удовлетворительным для позиции позиции жесткого кода). Но пункты меню, открывающие подменю, не имеют идентификаторов команд. Я могу получить команду меню, которая существует внутри этого подменю, но тогда у меня все еще нет самого меню.

Как я могу найти подменю, вложенное в основное меню, не полагаясь на MF_BYPOSITION?

ответ

2

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

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

Подход, который я использовал в результате изучения кода, используемого MFC для заполнения последнего файла в меню «Файл». Общая методика описана в несколько датированном Paul DiLascia's Q & A column from Microsoft Systems Journal.

1

Вы можете использовать метод GetSubMenu из класса CMenu.

http://msdn.microsoft.com/en-us/library/dtfc356x(v=vs.80).aspx

+1

К сожалению, для этого требуется указать положение подменю. Это означает, что код, который я пишу, будет разбит при каждом изменении пунктов меню. Вот почему я специально стараюсь избегать этого. –

+0

попробуйте создать перечисление, чем каждый раз, когда вы добавляете новое меню, просто добавьте его в перечисление. И индекс, который вы должны передать, является индексом в параметре подменю, являющимся реальным индексом меню, если вы добавите элемент в одно из подменю, порядок меню не будет изменен. – jonathanrz

1

Было бы намного проще использовать маршрутизацию команд MFC, позволяющую обновлять пункты меню? Если это приложение MDI/SDI, у вас есть это бесплатно, если нет, вам придется внедрить механизм обновления.

Не обрабатывайте WM_INITMENU. Вы должны обрабатывать WM_INITMENUPOPUP. WM_INITMENUPOPUP поставляет указатель на меню, которое вот-вот появится.

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

4

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

int CEnviroView::FindMenuItem(CMenu* Menu, LPCTSTR MenuName) { 
    int count = Menu->GetMenuItemCount(); 
    for (int i = 0; i < count; i++) { 
     CString str; 
     if (Menu->GetMenuString(i, str, MF_BYPOSITION) && 
      str.Compare(MenuName) == 0) 
      return i; 
    } 
    return -1; 
} 
Смежные вопросы