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

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

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;
}

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