次の方法で共有


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_BYCOMMAND または MF_BYPOSITION フラグによってこれらを結合するのビットごとの OR 演算子に使用します。

  • nIDNewItem
    nFlags がに設定されている場合 MF_POPUP新しいメニュー項目のコマンド ID、または、ポップアップ メニューのメニュー ハンドル (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 以外を返します。それ以外の場合は 0 を返します。

解説

アプリケーションは nFlagsで値を設定するとメニュー項目の状態を指定できます。

ウィンドウに存在するメニューが (ウィンドウが表示されているかどうか) 変更されるたびに、アプリケーションは CWnd::DrawMenuBarを呼び出す必要があります。

nIDNewItem がポップアップ メニューを指定すると、挿入したメニューに含まれます。そのメニューが破棄されると、挿入したメニューも破棄されます。メニューは挿入 CMenu のオブジェクトから競合を回避するために、デタッチする必要があります。

ドキュメント Interface (MDI) の複数のアクティブな子ウィンドウ、MDI アプリケーションのメニューへのアプリケーションの挿入がポップアップ メニューこの関数を呼び出して、MF_BYPOSITION のフラグを指定することで、最大化できない場合、メニューが予想どおり、1 の位置の左端挿入します。これは、アクティブな 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;
}

必要条件

ヘッダー: afxwin.h

参照

関連項目

CMenu クラス

階層図

CMenu::AppendMenu

CWnd::DrawMenuBar

CMenu::SetMenuItemBitmaps

CMenu::Detach

InsertMenu