Шаг 876 - 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 следующими способами:

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

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

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

Пример

// CMAINFRAME:: OnChangeFileMenu () - драйвер команды меню для 
// CMainFrame класса, который в свою очередь является классом  наследником CFrameWnd. 
// Это изменяет меню File,  вставляя, удаляя и переименование 
// yекоторые пункты меню. Другие операции включают соединение контекста 
// идентификатор справки и установка заданного по умолчанию пункта меню к меню 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;
}

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 9.02.2002