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