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

    指定参数为现有菜单项的命令ID。 如果 MF_BYCOMMANDMF_BYPOSITION 未设置,这是默认值。

    MF_BYPOSITION

    指定参数为现有菜单项的位置。 第一项在位置0。 如果 nPosition 为– 1,新菜单项追加到菜单的末尾。

  • nFlags
    指定 nPosition 如何解释然后指定有关新菜单项的状态的信息,这些信息添加到菜单中。 有关可以设置标志的列表,请参见 AppendMenu 成员函数。 若要指定多个值,请使用按位或运算符将它们与 MF_BYCOMMANDMF_BYPOSITION 标志。

  • nIDNewItem
    指定新菜单项的命令ID;或者,如果 nFlags 设置为 MF_POPUP,菜单句柄(HMENU)弹出菜单。 nIDNewItem 参数将被忽略(不需要),如果 nFlags 设置为 MF_SEPARATOR

  • lpszNewItem
    指定新菜单项的内容。 nFlags 可用于以下方式解释 lpszNewItem :

    nFlags

    lpszNewItem的说明

    MF_OWNERDRAW

    包含应用程序可以使用维护其他数据与菜单项的一个由应用程序提供的32位值。 该32位值对应用程序可在 WM_MEASUREITEMWM_DRAWITEM 消息提供的结构的 itemData 成员。 这些信息,该菜单项最初显示或更改时,发送。

    MF_STRING

    包含较长的指针传递一个Null终止的字符串。 这是默认解释。

    MF_SEPARATOR

    lpszNewItem 参数将被忽略(不需要)。

  • pBmp
    指向 CBitmap 将用作菜单项的对象。

返回值

非零,如果函数运行成功;否则为0。

备注

应用程序可以通过设置值来指定菜单项的状态。nFlags。

只要位于窗口更改的菜单(窗口是否显示),应用程序应调用 CWnd::DrawMenuBar

当 nIDNewItem 指定弹出菜单时,它成为其插入的一部分的菜单。 如果销毁该菜单,还将在销毁插入的菜单。 应从 CMenu 对象分离一个插入的菜单避免冲突。

如果活动的多文档界面(mdi)窗口最大化,并(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

请参见

参考

CMenu选件类

层次结构图

CMenu::AppendMenu

CWnd::DrawMenuBar

CMenu::SetMenuItemBitmaps

CMenu::Detach

InsertMenu