Partager via


CMenu::LoadMenuIndirect

Charge une ressource d'un modèle de menu en mémoire et la attaché à l'objet d' CMenu .

BOOL LoadMenuIndirect(
   const void* lpMenuTemplate 
);

Paramètres

  • lpMenuTemplate
    Indique un modèle de menu (qui est une structure unique de MENUITEMTEMPLATEHEADER et une collection d'un ou plusieurs structures de MENUITEMTEMPLATE ).Pour plus d'informations sur ces deux structures, consultez Kit de développement logiciel Windows.

Valeur de retour

Une valeur différente de zéro si la ressource menu était chargée correctement ; sinon 0.

Notes

Un modèle de menu est un en-tête suivi d'une collection d'un ou plusieurs structures de MENUITEMTEMPLATE , qui peuvent contenir un ou plusieurs éléments de menu et menus contextuels.

Le numéro de version doit avoir la valeur 0.

Les balises de mtOption doivent inclure MF_END pour le dernier élément dans une liste contextuelle et pour le dernier élément de la liste principale.Consultez la fonction membre d' AppendMenu pour d'autres balises.Le membre de mtId doit être omis de la structure de MENUITEMTEMPLATE lorsque MF_POPUP est spécifié dans mtOption.

L'espace alloué pour la structure de MENUITEMTEMPLATE doit être assez grand pour mtString contienne le nom de l'élément de menu en tant que chaîne terminée par le caractère NULL.

Avant de quitter, une application doit libérer des ressources système associées à un menu si le menu n'est pas assigné à une fenêtre.Une application libère un menu en appelant la fonction membre de DestroyMenu .

Exemple

// CMainFrame::OnLoadMenuIndirect() is a menu command handler for 
// CMainFrame class, which in turn is a CFrameWnd-derived class. It 
// shows how to use LoadMenuIndirect() to load a resource from a 
// menu template in memory.
void CMainFrame::OnLoadMenuIndirect() 
{
   // For simplicity, allocate 500 bytes from stack. May use 
   // GlobalAlloc() to allocate memory bytes from heap.
   BYTE milist[500];
   memset(milist, 0, 500);
   int bytes_left = sizeof(milist);

   // Fill up the MENUITEMTEMPLATEHEADER structure.
   MENUITEMTEMPLATEHEADER* mheader = (MENUITEMTEMPLATEHEADER*) milist;
   mheader->versionNumber = 0;
   mheader->offset = 0;

   int bytes_used = sizeof(MENUITEMTEMPLATEHEADER);
   bytes_left -= bytes_used;

   // Add the following menu items to menu bar:
   // File     Edit
   //   Exit     Copy
   //            Paste
   bytes_used += AddMenuItem(milist + bytes_used, bytes_left, L"&File", 0, 
      TRUE, FALSE);
   bytes_left -= bytes_used;
   bytes_used += AddMenuItem(milist + bytes_used, bytes_left, L"E&xit", 
      ID_APP_EXIT, FALSE, TRUE);
   bytes_left -= bytes_used;
   bytes_used += AddMenuItem(milist + bytes_used, bytes_left, L"&Edit", 0, 
      TRUE, TRUE);
   bytes_left -= bytes_used;
   bytes_used += AddMenuItem(milist + bytes_used, bytes_left, L"&Copy", 
      ID_EDIT_COPY, FALSE, FALSE);
   bytes_left -= bytes_used;
   bytes_used += AddMenuItem(milist + bytes_used, bytes_left, L"&Paste", 
      ID_EDIT_PASTE, FALSE, TRUE);
   bytes_left -= bytes_used;

   // Load resource from a menu template in memory.
   ASSERT(m_IndiMenu.LoadMenuIndirect(milist));

   // Remove and destroy old menu
   SetMenu(NULL);
   ::DestroyMenu(m_hMenuDefault);

   // Add new menu.
   SetMenu(&m_IndiMenu);

   // Assign default menu
   m_hMenuDefault = m_IndiMenu.m_hMenu;
}

// This is a helper function for adding a menu item (either a popup 
// or command item) to the specified menu template.
//
//    MenuTemplate  - pointer to a menu template
//    TemplateBytes - space remaining in MenuTemplate
//    MenuString    - string for the menu item to be added
//    MenuID        - id for the command item. Its value is ignored if 
//                    IsPopup is TRUE.
//    IsPopup       - TRUE for popup menu (or submenu); FALSE for command 
//                    item
//    LastItem      - TRUE if MenuString is the last item for the popup; 
//                    FALSE otherwise.
UINT AddMenuItem(LPVOID MenuTemplate, int TemplateBytes, WCHAR* MenuString, 
   WORD MenuID, BOOL IsPopup, BOOL LastItem)
{
   MENUITEMTEMPLATE* mitem = (MENUITEMTEMPLATE*) MenuTemplate;

   UINT  bytes_used = 0;
   if (IsPopup)         // for popup menu
   {      
      if (LastItem)
         mitem->mtOption = MF_POPUP | MF_END;
      else
         mitem->mtOption = MF_POPUP;
      bytes_used += sizeof (mitem->mtOption);  

      mitem = (MENUITEMTEMPLATE*) ((BYTE*) MenuTemplate + bytes_used);
      // a popup doesn't have mtID!!!

      TemplateBytes -= bytes_used;
      wcscpy_s((WCHAR*) mitem, TemplateBytes / sizeof(WCHAR), MenuString);
      bytes_used += (UINT)(sizeof (WCHAR) * (wcslen(MenuString) + 1)); // include '\0'   
   }
   else      // for command item
   {
      mitem->mtOption = LastItem ? MF_END : 0;
      mitem->mtID = MenuID; 
      TemplateBytes -= bytes_used;
      wcscpy_s(mitem->mtString, TemplateBytes / sizeof(WCHAR), MenuString);  
      bytes_used += (UINT)(sizeof (mitem->mtOption ) + sizeof (mitem->mtID) + 
         sizeof (WCHAR) * (wcslen(MenuString) + 1));   // include '\0'
   }

   return bytes_used;
}

Configuration requise

Header: afxwin.h

Voir aussi

Référence

Classe de CMenu

Graphique de la hiérarchie

CMenu::DestroyMenu

CMenu::LoadMenu

LoadMenuIndirect

CMenu::AppendMenu