Поделиться через


CMenu::InsertMenu

Вставляет новый пункт меню в позицию, указанную nPosition и перемещает другие элементы вниз с меню.

BOOL InsertMenu( 
   UINT nPosition, 
   UINT nFlags, 
   UINT_PTR nIDNewItem = 0, 
   LPCTSTR lpszNewItem = NULL  
); 
BOOL InsertMenu( 
   UINT nPosition, 
   UINT nFlags, 
   UINT_PTR nIDNewItem, 
   const CBitmap* pBmp  
);

Параметры

  • nPosition
    Определяет пункт меню, перед которым вставляется новый пункт меню. Параметр nFlags может использоваться для интерпретации nPosition следующими способами:

    nFlags

    Интерпретация nPosition

    MF_BYCOMMAND

    Указывает, что параметр содержит идентификатор команды существующего пункта меню. Это значение по умолчанию, если ни MF_BYCOMMAND ни MF_BYPOSITION установлены.

    MF_BYPOSITION

    Указывает, что данный параметр предоставляет позицию существующего пункта меню. Первый элемент в позиции 0. Если nPosition 1, то новый пункт меню добавлено в конец меню.

  • nFlags
    Определяет способ интерпретации nPosition и задает сведения о состоянии нового пункта меню, когда он добавить в меню. Список флагов, которые могут быть установлены, см. в разделе AppendMenu функции-члена. Чтобы задать более одного значения, используйте оператор побитового ИЛИ объединить их с флагом MF_BYCOMMAND или MF_BYPOSITION.

  • nIDNewItem
    Определяет или идентификатор команды нового пункта меню или, если nFlags установлено в MF_POPUP, то дескриптор меню (HMENU) раскрывающегося меню. Параметр nIDNewItem игнорировать (), если nFlags установлено в MF_SEPARATOR.

  • lpszNewItem
    Определяет содержимое нового пункта меню. nFlags может использоваться для интерпретации lpszNewItem следующими способами:

    nFlags

    Интерпретация lpszNewItem

    MF_OWNERDRAW

    Содержит приложение- предоставленное 32 разрядное значение, приложение может использовать для поддержки дополнительных данных, связанных с пунктом меню. Это значение 32 разрядное доступны для приложения в члене структуры itemData предоставленной сообщениями WM_MEASUREITEM и WM_DRAWITEM. Эти сообщения отправлены изначально отображается при выборе пункта меню или изменить.

    MF_STRING

    Содержит длинный указатель на null- завершенной строке. Это интерпретация по умолчанию.

    MF_SEPARATOR

    Параметр lpszNewItem игнорировать ().

  • pBmp
    Указывает на CBitmap объект, которое будет использоваться в качестве пункт меню.

Возвращаемое значение

Ненулевой если функция успешно; в противном случае – значение 0.

Заметки

Приложение может определить состояние пункта меню значениями параметра в nFlags.

При изменен меню, находящаяся в окне (отображается ли окно), приложение должно вызвать CWnd::DrawMenuBar.

При nIDNewItem задает контекстное меню меню, становится частью меню, в котором оно вставляется. Если меню удалено, то вставленные меню также будет удалено. Inserted меню должно быть наконец удалено из объекта CMenu во избежание конфликта.

Если активное множественное дочернее окно интерфейса MDI развернуты и вставки приложения всплывающее меню в меню приложения MDI путем вызова эта функция и указав пометить MF_BYPOSITION, то меню вставляется одной левой позиции дальней более чем ожидалось. Это происходит потому, что меню активно дочернего элемента управления в окне интерфейса MDI вставляется в первую позицию строки меню фреймового окна MDI. Для размещения меню правильно, приложение должно добавить 1 к значению позиции, в противном случае было бы использоваться. Приложение может использовать сообщение WM_MDIGETACTIVE, чтобы определить, что активное в данный момент дочернее окно развернуто.

Пример

// CMainFrame::OnChangeFileMenu() is a menu command handler for  
// CMainFrame class, which in turn is a CFrameWnd-derived class.  
// It modifies the File menu by inserting, removing and renaming  
// some menu items. Other operations include associating a context  
// help id and setting default menu item to the File menu.  
// CMainFrame is a CFrameWnd-derived class. 
void CMainFrame::OnChangeFileMenu() 
{
   // Get the menu from the application window.
   CMenu* mmenu = GetMenu();

   // Look for "File" menu.
   int pos = FindMenuItem(mmenu, _T("&File"));
   if (pos == -1)
      return;

   // Remove "New" menu item from the File menu.
   CMenu* submenu = mmenu->GetSubMenu(pos);
   pos = FindMenuItem(submenu, _T("&New\tCtrl+N"));
   if (pos > -1)
      submenu->RemoveMenu(pos, MF_BYPOSITION);

   // Look for "Open" menu item from the File menu. Insert a new 
   // menu item called "Close" right after the "Open" menu item.
   // ID_CLOSEFILE is the command id for the "Close" menu item.
   pos = FindMenuItem(submenu, _T("&Open...\tCtrl+O"));
   if (pos > -1)
      submenu->InsertMenu(pos + 1, MF_BYPOSITION, ID_CLOSEFILE, _T("&Close"));

   // Rename menu item "Exit" to "Exit Application".
   pos = FindMenuItem(submenu, _T("E&xit"));
   if (pos > -1)
   {
      UINT id = submenu->GetMenuItemID(pos);
      submenu->ModifyMenu(id, MF_BYCOMMAND, id, _T("E&xit Application"));
   }

   // Associate a context help ID with File menu, if one is not found. 
   // ID_FILE_CONTEXT_HELPID is the context help ID for the File menu 
   // that is defined in resource file.  
   if (submenu->GetMenuContextHelpId() == 0)
      submenu->SetMenuContextHelpId(ID_FILE_CONTEXT_HELPID);

   // Set "Open" menu item as the default menu item for the File menu, 
   // if one is not found. So, when a user double-clicks the File 
   // menu, the system sends a command message to the menu's owner  
   // window and closes the menu as if the File\Open command item had  
   // been chosen.  
   if (submenu->GetDefaultItem(GMDI_GOINTOPOPUPS, TRUE) == -1)
   {
      pos = FindMenuItem(submenu, _T("&Open...\tCtrl+O"));
      submenu->SetDefaultItem(pos, TRUE);
   }
}

// FindMenuItem() will find a menu item string from the specified 
// popup menu and returns its position (0-based) in the specified  
// popup menu. It returns -1 if no such menu item string is found. 
int FindMenuItem(CMenu* Menu, LPCTSTR MenuString)
{
   ASSERT(Menu);
   ASSERT(::IsMenu(Menu->GetSafeHmenu()));

   int count = Menu->GetMenuItemCount();
   for (int i = 0; i < count; i++)
   {
      CString str;
      if (Menu->GetMenuString(i, str, MF_BYPOSITION) &&
         str.Compare(MenuString) == 0)
         return i;
   }

   return -1;
}

Требования

Header: afxwin.h

См. также

Ссылки

Класс CMenu

Диаграмма иерархии

CMenu::AppendMenu

CWnd::DrawMenuBar

CMenu::SetMenuItemBitmaps

CMenu::Detach

InsertMenu