CMenu::InsertMenu
Wstawia nowy element menu pozycji określonej przez nPosition i przesunięcie do innych elementów menu.
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
);
Parametry
nPosition
Określa element menu, przed którym nowy element menu jest wstawiany.nFlags Parametru można interpretować nPosition w następujący sposób:nFlags
Interpretacja nPosition
MF_BYCOMMAND
Określa, że parametr podaje identyfikator polecenia istniejący element menu.Jest to wartość domyślna, jeśli żadna MF_BYCOMMAND ani MF_BYPOSITION jest ustawiona.
MF_BYPOSITION
Określa, że parametr podaje położenie istniejący element menu.Pierwszy element jest w położeniu 0.Jeśli nPosition jest –1, nowy element menu jest dołączana na końcu menu.
nFlags
Określa, jak nPosition jest interpretowana i określa informacje o stanie nowy element menu, które jest dodawane do menu.Listę flag, które mogą być ustawione, zobacz AppendMenu zawsze funkcji składowej.Aby określić więcej niż jedną wartość, należy użyć operatora OR bitowe połączyć je z MF_BYCOMMAND lub MF_BYPOSITION flagi.nIDNewItem
Określa identyfikator polecenia nowy element menu lub, jeśli nFlags jest ustawiona na MF_POPUP, uchwyt menu (HMENU) z wyskakującego menu.nIDNewItem Parametr jest ignorowany (nie jest to potrzebne), jeśli nFlags jest ustawiona na MF_SEPARATOR.lpszNewItem
Określa zawartość nowego elementu menu.nFlagsmoże służyć do interpretowania lpszNewItem w następujący sposób:nFlags
Interpretacja lpszNewItem
MF_OWNERDRAW
Zawiera wartość 32-bitowe dostarczone aplikacji używające aplikacji do obsługi dodatkowych danych skojarzone z elementem menu.Ta wartość 32-bitowych jest dostępna do stosowania w itemData Członkowskich struktury dostarczonych przez WM_MEASUREITEM i WM_DRAWITEM wiadomości.Wiadomości są wysyłane, gdy element menu jest początkowo wyświetlany lub zostanie zmieniona.
MF_STRING
Zawiera wskaźnik długi ciąg zakończony znakiem null.Jest to domyślny interpretacji.
MF_SEPARATOR
lpszNewItem Parametr jest ignorowany (nie jest konieczne).
pBmp
Wskazuje na CBitmap obiekt, który będzie używany jako element menu.
Wartość zwracana
Niezerowa, jeśli funkcja jest pomyślne; 0 inaczej.
Uwagi
Wniosek można określić stan elementu menu przez ustawienie wartości nFlags.
W przypadku, gdy menu rezyduje w oknie zostanie zmieniona (lub nie jest wyświetlane okno), aplikacja powinna wywołać CWnd::DrawMenuBar.
Gdy nIDNewItem określa wyskakującego menu, staje się częścią menu, w którym jest wstawiany.Jeśli zniszczenia tego menu, menu wstawionego również zostać zniszczone.Wstawiony menu powinny być odłączone od CMenu obiekt, aby uniknąć konfliktu.
Jeśli aktywne wielu dokumentów (MDI) interfejsu dziecko okno jest zmaksymalizowane i aplikacja wstawia wyskakującego menu do menu aplikacji MDI wywołanie tej funkcji i określając MF_BYPOSITION jest menu Flaga, dodaje jedną pozycję w lewo dalej niż oczekiwano.Dzieje się tak, ponieważ w menu sterowania okna aktywnego podrzędnych MDI jest wstawiony pierwszy położenie paska menu okna MDI ramki.Położenie menu poprawnie, aplikacji należy dodać 1 do wartości pozycji w przeciwnym razie byłyby używane.Można użyć aplikacji WM_MDIGETACTIVE wiadomości, aby ustalić, czy jest zmaksymalizowane okno potomne aktualnie aktywne.
Przykład
// 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;
}
Wymagania
Nagłówek: afxwin.h