Шаг 585 - CMenu::InsertMenu.

Автор Каев А. Г.
BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );
BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp );

Возвращаемое значение
Отлично от нуля если функция успешна, иначе 0.

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

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

nFlags
Определяет, как nPosition интерпретируется и определяет информацию относительно состояния нового пункта меню когда он добавлен к меню. Для списка флажков, которые могут быть установлены, см. AppendMenu функцию. Чтобы определять больше чем одно значение, используйте поразрядный OR(или) оператор чтобы объединить их с флажком MF_BYPOSITION или MF_BYCOMMAND.
nIDNewItem
Определяет или команду ID нового пункта меню или если nFlags установлен к MF_POPUP дескриптор всплывающего меню (HMENU) меню . nIDNewItem параметр игнорируется (не необходим) если nFlags установлен к MF_SEPARATOR.

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

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

Замечания
Вставляет новый пункт меню в позиции, определенной nPosition и перемещает другие элементы вниз меню. Прикладная программа может определять состояние пункта меню, устанавливая значения в nFlags. Всякий раз, когда меню, которое постоянно находится в окне, изменено (отображается или нет окно), прикладная программа должна вызвать CWnd::DrawMenuBar.
Когда nIDNewItem определяет всплывающее меню это становится частью меню, в которое это вставлено. Если то меню разрушено, вставленное меню будет также разрушено. Вставленное меню должно отсоединиться из объекта CMenu чтобы избежать конфликта.
Если активная многодокументная среда (MDI) дочернее окно максимизируется и прикладная программа вставляет меню с поднятием в меню MDI прикладной программы, вызывая эту функцию и определяя флажок MF_BYPOSITION, меню вставлено на одну позицию дальше чем ожидаемый. Это случается, потому что Оконное меню активного MDI дочернего окна вставлено в первую позицию MDI строки меню окна рамки(пакета). Чтобы устанавливать меню правильно, прикладная программа должна добавить 1 к значению позиции, которое иначе использовалось бы. Прикладная программа может использовать WM_MDIGETACTIVE сообщение, чтобы определить, максимизируется ли в настоящее время активное дочернее окно.

Пример

// CMainFrame::OnChangeFileMenu() - драйвер команды меню для 
// CMainFrame класса который в свою очередь является классом унаследованным от CMainFrame. 
// Это изменяет меню File,  вставляя, удаляя и переименование 
// некоторые пункты меню. Другие операции включают соединение контекста 
// Идентификатор справки и установка заданного по умолчанию пункта меню к меню Файла. 
// CMainFrame - класс  унаследованный от CFrameWnd.

void CMainFrame::OnChangeFileMenu() 
{
   // Получите меню из окна прикладной программы.
   CMenu* mmenu = GetMenu();

   // Найдите "File" меню.
   int pos = FindMenuItem(mmenu, "&File");
   if (pos == -1)
      return;

   // Удалить пункт меню "New" из меню File.
   CMenu* submenu = mmenu->GetSubMenu(pos);
   pos = FindMenuItem(submenu, "&New\tCtrl+N");
   if (pos > -1)
      submenu->RemoveMenu(pos, MF_BYPOSITION);

   // Найти пункт меню "Open" из меню File. Вставьте новый
   // рункт меню по имени "Close" право после пункта меню "Open".
   // ID_CLOSEFILE - идентификатор команды для пункта меню "Close".
   pos = FindMenuItem(submenu, "&Open...\tCtrl+O");
   if (pos > -1)
      submenu->InsertMenu(pos + 1, MF_BYPOSITION, ID_CLOSEFILE, "&Close");

   // Переименовать "Save" пункта меню к " Save Selection".
   pos = FindMenuItem(submenu, "&Save\tCtrl+S");
   if (pos > -1)
   {
      UINT id = submenu->GetMenuItemID(pos);
      submenu->ModifyMenu(id, MF_BYCOMMAND, id, "&Save Selection");
   }

   // Сопоставить контекстную справку ID с меню File, если каждый не найден.
   // ID_FILE_CONTEXT_HELPID - контекстная справка ID для меню File
   // Это определено в файле ресурса. 
   if (submenu->GetMenuContextHelpId() == 0)
      submenu->SetMenuContextHelpId(ID_FILE_CONTEXT_HELPID);

   // Установить пункт меню "Open" как заданный по умолчанию пункт меню для меню File, 
   // Если каждый не найден. Так, когда пользователь дважды щелкает File
   // меню, система посылает сообщение команды владельцу меню 
   // Окно и закрывает меню, как будто элемент команды File\Open 
   // Выбранный. 

   if (submenu->GetDefaultItem(GMDI_GOINTOPOPUPS, TRUE) == -1)
   {
      pos = FindMenuItem(submenu, "&Open...\tCtrl+O");
      submenu->SetDefaultItem(pos, TRUE);
   }
}
// FindMenuItem () найдет строку пункта меню из определенного
// Всплывающее меню и возвраты позиция (0-основанная) в определенном 
// Всплывающее меню. Это возвращается -1, если никакая такая строка пункта меню не найдена.

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) &&
         (strcmp(str, MenuString) == 0))
         return i;
   }

   return -1;
}

Hosted by uCoz