Partager via


CMenu::InsertMenu

Insère un nouvel élément de menu à la position spécifiée par nPosition et déplace d'autres éléments vers le bas du 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  
);

Paramètres

  • nPosition
    Spécifie l'élément de menu avant lequel le nouvel élément de menu doit être inséré. Le paramètre d' nFlags peut être utilisé pour interpréter nPosition des façons suivantes :

    nFlags

    Interprétation de nPosition

    MF_BYCOMMAND

    Spécifie que le paramètre permet l'ID de commande de l'élément de menu existant. Valeur par défaut si aucun MF_BYCOMMAND ni MF_BYPOSITION n'est défini.

    MF_BYPOSITION

    Spécifie que le paramètre permet la position de l'élément de menu existant. Le premier élément est à la position 0. Si nPosition est à 1, le nouvel élément de menu est ajouté à la fin de le menu.

  • nFlags
    Spécifie comment nPosition est interprète et spécifie des informations sur l'état du nouvel élément de menu lorsqu'il est ajouté au menu. Pour une liste des balises qui peuvent être définies, consultez la fonction membre d' AppendMenu . Pour spécifier plusieurs valeurs, utilisez l'opérateur de bits OR pour les associer à la balise de MF_BYCOMMAND ou de MF_BYPOSITION .

  • nIDNewItem
    Spécifie l'ID de commande du nouvel élément de menu ou, si nFlags a la valeur MF_POPUP, le handle de menu (HMENU) du menu contextuel. Le paramètre d' nIDNewItem est ignoré (sauf) si nFlags a la valeur MF_SEPARATOR.

  • lpszNewItem
    Spécifie le contenu du nouvel élément de menu. nFlags peut être utilisé pour interpréter lpszNewItem des façons suivantes :

    nFlags

    Interprétation de lpszNewItem

    MF_OWNERDRAW

    Contient une valeur 32 bits fournie par l'application que l'application peut utiliser pour mettre à jour les informations supplémentaires associées à l'élément de menu. Cette valeur 32 bits est disponible à l'application dans le membre d' itemData de la structure fournie par les messages de WM_MEASUREITEM et de WM_DRAWITEM . Ces messages sont envoyés lorsque l'élément de menu est initialement rendu ou est modifié.

    MF_STRING

    Contient un long pointeur vers une chaîne terminée par le caractère NULL. c'est la traduction par défaut.

    MF_SEPARATOR

    Le paramètre d' lpszNewItem est ignoré (sauf).

  • pBmp
    Les points à CBitmap objet qui sera utilisé comme élément de menu.

Valeur de retour

Une valeur différente de zéro si la fonction est réussie ; sinon 0.

Notes

L'application peut spécifier l'état de l'élément de menu en définissant des valeurs dans nFlags.

Chaque fois qu'un menu qui réside dans une fenêtre est modifié (si la fenêtre est affichée), l'application doit appeler CWnd::DrawMenuBar.

Lorsque nIDNewItem spécifie un menu contextuel, il devient partie intégrante du menu dans lequel il est inséré. Si ce menu est détruit, le menu sera inséré également détruit. Un menu inséré doit être détaché d'un objet d' CMenu pour éviter les conflits.

Si la fenêtre enfant active d'interface multidocument (MDI) est agrandie et insère d'une application un menu contextuel dans le menu de l'application MDI en appelant cette fonction et en spécifiant la balise de MF_BYPOSITION , le menu est inséré un gauche plus lointain de position que prévu. Cela se produit car le menu de contrôle de la fenêtre MDI enfant active est inséré dans la première position de la barre de menus de la fenêtre frame MDI. Pour positionner le menu correctement, l'application doit ajouter 1 à la valeur de position qui devrait être utilisée. Une application peut utiliser le message de WM_MDIGETACTIVE pour déterminer si actuel - la fenêtre enfant active est agrandie.

Exemple

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

Configuration requise

Header: afxwin.h

Voir aussi

Référence

CMenu, classe

Graphique de la hiérarchie

CMenu::AppendMenu

CWnd::DrawMenuBar

CMenu::SetMenuItemBitmaps

CMenu::Detach

InsertMenu