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


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