次の方法で共有


CMenu クラス

Windows の HMENUをカプセル化したものです。

構文

class CMenu : public CObject

メンバー

パブリック コンストラクター

名前 説明
CMenu::CMenu CMenu オブジェクトを構築します。

パブリック メソッド

名前 説明
CMenu::AppendMenu このメニューの末尾に新しい項目を追加します。
CMenu::Attach Windows メニュー ハンドルを CMenu オブジェクトにアタッチします。
CMenu::CheckMenuItem ポップアップ メニューのメニュー項目の横にチェック マークを配置するか、チェック マークを削除します。
CMenu::CheckMenuRadioItem メニュー項目の横にラジオ ボタンを配置し、グループ内の他のすべてのメニュー項目からラジオ ボタンを削除します。
CMenu::CreateMenu 空のメニューを作成し、 CMenu オブジェクトにアタッチします。
CMenu::CreatePopupMenu 空のポップアップ メニューを作成し、 CMenu オブジェクトにアタッチします。
CMenu::DeleteMenu メニューから指定した項目を削除します。 メニュー項目に関連するポップアップ メニューがある場合は、ポップアップ メニューへのハンドルを破棄し、そのポップアップ メニューで使用されるメモリを解放します。
CMenu::DeleteTempMap FromHandle メンバー関数によって作成された一時的なCMenu オブジェクトを削除します。
CMenu::DestroyMenu CMenu オブジェクトにアタッチされているメニューを破棄し、メニューが占有していたメモリを解放します。
CMenu::Detach CMenu オブジェクトから Windows メニュー ハンドルをデタッチし、ハンドルを返します。
CMenu::DrawItem 所有者が描画したメニューの視覚的な側面が変更されたときにフレームワークによって呼び出されます。
CMenu::EnableMenuItem メニュー項目を有効、無効、または淡色表示 (灰色) にします。
CMenu::FromHandle Windows メニュー ハンドルを指定して、 CMenu オブジェクトへのポインターを返します。
CMenu::GetDefaultItem 指定したメニューの既定のメニュー項目を決定します。
CMenu::GetMenuContextHelpId メニューに関連付けられているヘルプ コンテキスト ID を取得します。
CMenu::GetMenuInfo 特定のメニューの情報を取得します。
CMenu::GetMenuItemCount ポップアップ メニューまたはトップレベル メニュー内の項目の数を決定します。
CMenu::GetMenuItemID 指定した位置にあるメニュー項目のメニュー項目識別子を取得します。
CMenu::GetMenuItemInfo メニュー項目に関する情報を取得します。
CMenu::GetMenuState 指定したメニュー項目の状態またはポップアップ メニューの項目数を返します。
CMenu::GetMenuString 指定したメニュー項目のラベルを取得します。
CMenu::GetSafeHmenu このCMenu オブジェクトによってラップされたm_hMenuを返します。
CMenu::GetSubMenu ポップアップ メニューへのポインターを取得します。
CMenu::InsertMenu 指定した位置に新しいメニュー項目を挿入し、他の項目をメニューの下に移動します。
CMenu::InsertMenuItem メニュー内の指定した位置に新しいメニュー項目を挿入します。
CMenu::LoadMenu 実行可能ファイルからメニュー リソースを読み込み、 CMenu オブジェクトにアタッチします。
CMenu::LoadMenuIndirect メモリ内のメニュー テンプレートからメニューを読み込み、 CMenu オブジェクトにアタッチします。
CMenu::MeasureItem 所有者が描画したメニューが作成されたときにメニューディメンションを決定するためにフレームワークによって呼び出されます。
CMenu::ModifyMenu 指定した位置にある既存のメニュー項目を変更します。
CMenu::RemoveMenu ポップアップ メニューが関連付けられているメニュー項目を、指定したメニューから削除します。
CMenu::SetDefaultItem 指定したメニューの既定のメニュー項目を設定します。
CMenu::SetMenuContextHelpId メニューに関連付けるヘルプ コンテキスト ID を設定します。
CMenu::SetMenuInfo 特定のメニューに関する情報を設定します。
CMenu::SetMenuItemBitmaps 指定したチェック マーク ビットマップをメニュー項目に関連付けます。
CMenu::SetMenuItemInfo メニュー項目に関する情報を変更します。
CMenu::TrackPopupMenu 指定した場所にフローティング ポップアップ メニューを表示し、ポップアップ メニューの項目の選択を追跡します。
CMenu::TrackPopupMenuEx 指定した場所にフローティング ポップアップ メニューを表示し、ポップアップ メニューの項目の選択を追跡します。

パブリック演算子

名前 説明
CMenu::operator HMENU メニュー オブジェクトのハンドルを取得します。
CMenu::operator != 2 つのメニュー オブジェクトが等しくないかどうかを判断します。
CMenu::operator == 2 つのメニュー オブジェクトが等しいかどうかを判断します。

パブリック データ メンバー

名前 説明
CMenu::m_hMenu CMenu オブジェクトにアタッチされている Windows メニューのハンドルを指定します。

解説

メニューを作成、追跡、更新、および破棄するためのメンバー関数を提供します。

スタック フレーム上にローカルとして CMenu オブジェクトを作成し、 CMenuのメンバー関数を呼び出して、必要に応じて新しいメニューを操作します。 次に、 CWnd::SetMenu を呼び出してメニューをウィンドウに設定し、その直後に CMenu オブジェクトの Detach メンバー関数を呼び出します。 CWnd::SetMenuメンバー関数は、ウィンドウのメニューを新しいメニューに設定し、メニューの変更を反映するようにウィンドウを再描画し、メニューの所有権をウィンドウに渡します。 Detachを呼び出すと、CMenu オブジェクトからHMENUがデタッチされるため、ローカル CMenu変数がスコープ外に渡されるときに、CMenu オブジェクトデストラクターは、所有していないメニューを破棄しようとしません。 ウィンドウが破棄されると、メニュー自体が自動的に破棄されます。

LoadMenuIndirectメンバー関数を使用すると、メモリ内のテンプレートからメニューを作成できますが、LoadMenuの呼び出しによってリソースから作成されたメニューはより簡単に管理でき、メニュー リソース自体はメニュー エディターで作成および変更できます。

継承階層

CObject

CMenu

要件

ヘッダー: afxwin.h

CMenu::AppendMenu

メニューの末尾に新しい項目を追加します。

BOOL AppendMenu(
    UINT nFlags,
    UINT_PTR nIDNewItem = 0,
    LPCTSTR lpszNewItem = NULL);

BOOL AppendMenu(
    UINT nFlags,
    UINT_PTR nIDNewItem,
    const CBitmap* pBmp);

パラメーター

nFlags
新しいメニュー項目がメニューに追加されたときの状態に関する情報を指定します。 これは、「解説」セクションにリストされている 1 つ以上の値で構成されます。

nIDNewItem
新しいメニュー項目のコマンド ID を指定するか、 nFlagsMF_POPUPに設定されている場合は、ポップアップ メニューのメニュー ハンドル (HMENU) を指定します。 nFlagsMF_SEPARATOR に設定されている場合、nIDNewItem パラメーターは無視されます (不要)。

lpszNewItem
新しいメニュー項目の内容を指定します。 nFlags パラメーターは、次のようにlpszNewItemを解釈するために使用されます。

nFlags の解釈 lpszNewItem
MF_OWNERDRAW メニュー項目に関連付けられた追加データを維持するためにアプリケーションが使用できる、アプリケーション提供の 32 ビット値が含まれます。 この 32 ビット値は、 WM_MEASUREITEM および WM_DRAWITEM メッセージを処理するときにアプリケーションで使用できます。 値は、それらのメッセージで提供される構造体の itemData メンバーに格納されます。
MF_STRING null で終わる文字列へのポインターを格納します。 これが既定の解釈です。
MF_SEPARATOR lpszNewItem パラメーターは無視されます (不要)。

pBmp
メニュー項目として使用される CBitmap オブジェクトを指します。

戻り値

正常終了した場合は 0 以外を返します。それ以外の場合は 0 を返します。

解説

アプリケーションでは、 nFlagsの値を設定することで、メニュー項目の状態を指定できます。 ポップアップ メニュー nIDNewItem 指定すると、追加先のメニューの一部になります。 そのメニューが破棄されると、追加されたメニューも破棄されます。 競合を回避するには、追加されたメニューを CMenu オブジェクトからデタッチする必要があります。 MF_STRINGMF_OWNERDRAWは、AppendMenuのビットマップ バージョンでは無効であることに注意してください。

次の一覧では、 nFlagsで設定できるフラグについて説明します。

  • MF_CHECKED アイテムの横に既定のチェック マークを配置する MF_UNCHECKED を持つトグルとして機能します。 アプリケーションがチェック マーク ビットマップ ( SetMenuItemBitmaps メンバー関数を参照) を提供すると、"チェック マークオン" ビットマップが表示されます。

  • MF_UNCHECKED アイテムの横にあるチェック マークを削除する MF_CHECKED のトグルとして機能します。 アプリケーションがチェック マーク ビットマップを提供すると ( SetMenuItemBitmaps メンバー関数を参照)、"チェック マークオフ" ビットマップが表示されます。

  • MF_DISABLED メニュー項目を無効にして、選択できないが暗くしないようにします。

  • MF_ENABLED メニュー項目を選択できるように有効にし、淡色表示の状態から復元します。

  • MF_GRAYED メニュー項目を無効にして選択できないようにし、暗くします。

  • MF_MENUBARBREAK 項目を静的メニューの新しい行またはポップアップ メニューの新しい列に配置します。 新しいポップアップ メニュー列は、古い列から垂直分割線で区切ります。

  • MF_MENUBREAK 項目を静的メニューの新しい行またはポップアップ メニューの新しい列に配置します。 列間に分割線は配置されません。

  • MF_OWNERDRAW アイテムが所有者描画アイテムであることを指定します。 メニューが初めて表示されるときに、メニューを所有するウィンドウは、メニュー項目の高さと幅を取得する WM_MEASUREITEM メッセージを受け取ります。 WM_DRAWITEM メッセージは、所有者がメニュー項目の外観を更新する必要があるときに送信されるメッセージです。 このオプションは、トップレベルのメニュー項目では無効です。

  • MF_POPUP メニュー項目にポップアップ メニューが関連付けられていることを指定します。 ID パラメーターは、項目に関連付けるポップアップ メニューへのハンドルを指定します。 これは、トップレベルのポップアップ メニューまたは階層型ポップアップ メニューをポップアップ メニュー項目に追加するために使用されます。

  • MF_SEPARATOR 水平分割線を描画します。 ポップアップ メニューでのみ使用できます。 この線は、淡色表示、無効化、または強調表示できません。 その他のパラメーターは無視されます。

  • MF_STRING メニュー項目が文字列であることを指定します。

次の各グループは、相互に排他的であり、一緒に使用できないフラグを一覧表示します。

  • MF_DISABLEDMF_ENABLEDMF_GRAYED

  • MF_STRINGMF_OWNERDRAWMF_SEPARATOR、およびビットマップ バージョン

  • MF_MENUBARBREAKMF_MENUBREAK

  • MF_CHECKEDMF_UNCHECKED

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

CMenu::CreateMenu の例を参照してください。

CMenu::Attach

既存の Windows メニューを CMenu オブジェクトにアタッチします。

BOOL Attach(HMENU hMenu);

パラメーター

hMenu
Windows メニューへのハンドルを指定します。

戻り値

操作が成功した場合は 0 以外。それ以外の場合は 0。

解説

メニューが既に CMenu オブジェクトにアタッチされている場合は、この関数を呼び出さないでください。 メニュー ハンドルは、 m_hMenu データ メンバーに格納されます。

操作するメニューが既にウィンドウに関連付けられている場合は、 CWnd::GetMenu 関数を使用してメニューのハンドルを取得できます。

CMenu mnu;
HMENU hmnu = AfxGetMainWnd()->GetMenu()->GetSafeHmenu();
mnu.Attach(hmnu);

// Now you can manipulate the window's menu as a CMenu
// object...

mnu.Detach();

CMenu::CheckMenuItem

ポップアップ メニューのメニュー項目にチェック マークを追加または削除します。

UINT CheckMenuItem(
    UINT nIDCheckItem,
    UINT nCheck);

パラメーター

nIDCheckItem
nCheckによって決定される、チェックするメニュー項目を指定します。

nCheck
メニュー項目を確認する方法と、メニュー内の項目の位置を決定する方法を指定します。 nCheck パラメーターには、MF_CHECKEDまたはMF_UNCHECKEDMF_BYPOSITIONフラグまたはMF_BYCOMMAND フラグを組み合わせて使用できます。 これらのフラグは、ビットごとの OR 演算子を使用して結合できます。 次の意味があります。

  • MF_BYCOMMAND パラメーターが既存のメニュー項目のコマンド ID を指定することを指定します。 これが既定です。

  • MF_BYPOSITION パラメーターが既存のメニュー項目の位置を指定することを指定します。 最初の項目の位置は 0 です。

  • MF_CHECKED アイテムの横に既定のチェック マークを配置する MF_UNCHECKED を持つトグルとして機能します。

  • MF_UNCHECKED アイテムの横にあるチェック マークを削除する MF_CHECKED のトグルとして機能します。

戻り値

項目の以前の状態: MF_CHECKED または MF_UNCHECKED、メニュー項目が存在しない場合は 0xFFFFFFFF

解説

nIDCheckItem パラメーターは、変更する項目を指定します。

nIDCheckItemパラメーターは、ポップアップ メニュー項目とメニュー項目を識別できます。 ポップアップ メニュー項目を確認するために特別な手順は必要ありません。 トップレベルのメニュー項目はチェックできません。 ポップアップ メニュー項目は、メニュー項目識別子が関連付けられていないため、位置によってチェックする必要があります。

CMenu::GetMenuState の例を参照してください。

CMenu::CheckMenuRadioItem

指定したメニュー項目をチェックし、それをラジオ項目にします。

BOOL CheckMenuRadioItem(
    UINT nIDFirst,
    UINT nIDLast,
    UINT nIDItem,
    UINT nFlags);

パラメーター

nIDFirst
ラジオ ボタン グループの最初のメニュー項目 ( nFlagsの値に応じて、ID またはオフセットとして) を指定します。

nIDLast
ラジオ ボタン グループの最後のメニュー項目 ( nFlagsの値に応じて、ID またはオフセットとして) を指定します。

nIDItem
オプション ボタンでチェックするグループ内の項目を ( nFlagsの値に応じて、 ID またはオフセットとして) 指定します。

nFlags
nIDFirstnIDLast、およびnIDItemの解釈を次のように指定します。

nFlags 解釈
MF_BYCOMMAND パラメーターが既存のメニュー項目のコマンド ID を指定することを指定します。 これは、 MF_BYCOMMANDMF_BYPOSITION も設定されていない場合の既定値です。
MF_BYPOSITION パラメーターが既存のメニュー項目の位置を指定することを指定します。 最初の項目の位置は 0 です。

戻り値

成功した場合は 0 以外。それ以外の場合は 0

解説

同時に、この関数は関連付けられているグループ内の他のすべてのメニュー項目をオフにし、それらの項目のラジオ項目タイプフラグをクリアします。 チェック された項目は、チェック マーク ビットマップではなく、ラジオ ボタン (または行頭文字) ビットマップを使用して表示されます。

ON_COMMAND_RANGE の例を参照してください。

CMenu::CMenu

空のメニューを作成し、 CMenu オブジェクトにアタッチします。

CMenu();

解説

メニューは、 CMenuのいずれかの create または load メンバー関数を呼び出すまで作成されません。

CMenu::CreateMenu

メニューを作成し、 CMenu オブジェクトにアタッチします。

BOOL CreateMenu();

戻り値

メニューが正常に作成された場合は 0 以外。それ以外の場合は 0。

解説

メニューは最初は空です。 メニュー項目は、 AppendMenu または InsertMenu メンバー関数を使用して追加できます。

メニューがウィンドウに割り当てられている場合、ウィンドウが破棄されると自動的に破棄されます。

終了する前に、メニューがウィンドウに割り当てられない場合、アプリケーションはメニューに関連付けられているシステム リソースを解放する必要があります。 アプリケーションは、 DestroyMenu メンバー関数を呼び出すことによってメニューを解放します。

// The code fragment below shows how to create a new menu for the
// application window using CreateMenu() and CreatePopupMenu().
// Then, the created menu will replace the current menu of the
// application. The old menu will be destroyed with DestroyMenu().
// NOTE: The code fragment below is done in a CFrameWnd-derived class.

// Create a new menu for the application window.
VERIFY(m_NewMenu.CreateMenu());

// Create a "File" popup menu and insert this popup menu to the
// new menu of the application window. The "File" menu has only
// one menu item, i.e. "Exit".
VERIFY(m_FileMenu.CreatePopupMenu());
m_FileMenu.AppendMenu(MF_STRING, ID_APP_EXIT, _T("E&xit"));
m_NewMenu.AppendMenu(MF_POPUP, (UINT_PTR)m_FileMenu.m_hMenu, _T("&File"));

// Remove and destroy old menu
SetMenu(NULL);
CMenu *old_menu = CMenu::FromHandle(m_hMenuDefault);
old_menu->DestroyMenu();

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

// Assign default menu
m_hMenuDefault = m_NewMenu.m_hMenu;

CMenu::CreatePopupMenu

ポップアップ メニューを作成し、 CMenu オブジェクトにアタッチします。

BOOL CreatePopupMenu();

戻り値

ポップアップ メニューが正常に作成された場合は 0 以外。それ以外の場合は 0。

解説

メニューは最初は空です。 メニュー項目は、 AppendMenu または InsertMenu メンバー関数を使用して追加できます。 アプリケーションは、既存のメニューまたはポップアップ メニューにポップアップ メニューを追加できます。 TrackPopupMenuメンバー関数を使用すると、このメニューをフローティング ポップアップ メニューとして表示したり、ポップアップ メニューでの選択を追跡したりできます。

メニューがウィンドウに割り当てられている場合、ウィンドウが破棄されると自動的に破棄されます。 メニューが既存のメニューに追加されると、そのメニューが破棄されると自動的に破棄されます。

アプリケーションを終了する前に、メニューがウィンドウに割り当てられない場合は、ポップアップ メニューに関連付けられているシステム リソースを解放する必要があります。 アプリケーションは、 DestroyMenu メンバー関数を呼び出すことによってメニューを解放します。

CMenu::CreateMenu の例を参照してください。

CMenu::DeleteMenu

メニューから項目を削除します。

BOOL DeleteMenu(
    UINT nPosition,
    UINT nFlags);

パラメーター

nPosition
nFlagsによって決定される、削除するメニュー項目を指定します。

nFlags
次の方法で nPosition を解釈するために使用されます。

nFlags の解釈 nPosition
MF_BYCOMMAND パラメーターが既存のメニュー項目のコマンド ID を指定することを指定します。 これは、 MF_BYCOMMANDMF_BYPOSITION も設定されていない場合の既定値です。
MF_BYPOSITION パラメーターが既存のメニュー項目の位置を指定することを指定します。 最初の項目の位置は 0 です。

戻り値

正常終了した場合は 0 以外を返します。それ以外の場合は 0 を返します。

解説

メニュー項目に関連するポップアップ メニューがある場合、 DeleteMenu は、ポップアップ メニューへのハンドルを破棄し、ポップアップ メニューで使用されるメモリを解放します。

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

CWnd::GetMenu の例を参照してください。

CMenu::DeleteTempMap

CWinAppアイドル時間ハンドラーによって自動的に呼び出され、FromHandle メンバー関数によって作成された一時的なCMenu オブジェクトが削除されます。

static void PASCAL DeleteTempMap();

解説

DeleteTempMapは、CMenu オブジェクトを削除する前に、一時的なCMenu オブジェクトにアタッチされている Windows メニュー オブジェクトをデタッチします。

// DeleteTempMap() is a static member and does not need
// an instantiated CMenu object.
CMenu::DeleteTempMap();

CMenu::DestroyMenu

メニューと、使用されていた Windows リソースを破棄します。

BOOL DestroyMenu();

戻り値

メニューが破棄された場合は 0 以外。それ以外の場合は 0。

解説

メニューは破棄される前に、 CMenu オブジェクトからデタッチされます。 Windows DestroyMenu 関数は、 CMenu デストラクターで自動的に呼び出されます。

CMenu::CreateMenu の例を参照してください。

CMenu::Detach

CMenu オブジェクトから Windows メニューをデタッチし、ハンドルを返します。

HMENU Detach();

戻り値

成功した場合は Windows メニューへのハンドルの種類 HMENU。それ以外の場合は NULL

解説

m_hMenu データ メンバーは、NULLに設定されます。

CMenu mnu;
HMENU hmnu = AfxGetMainWnd()->GetMenu()->GetSafeHmenu();
mnu.Attach(hmnu);

// Now you can manipulate the window's menu as a CMenu
// object...

mnu.Detach();

CMenu::DrawItem

所有者が描画したメニューの視覚的な側面が変更されたときにフレームワークによって呼び出されます。

virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);

パラメーター

lpDrawItemStruct
必要な描画の種類に関する情報を含む DRAWITEMSTRUCT 構造体へのポインター。

解説

DRAWITEMSTRUCT構造体のitemAction メンバーは、実行する描画アクションを定義します。 このメンバー関数をオーバーライドして、所有者描画 CMenu オブジェクトの描画を実装します。 アプリケーションは、このメンバー関数の終了前に、 lpDrawItemStruct で指定された表示コンテキストに対して選択されているすべてのグラフィックス デバイス インターフェイス (GDI) オブジェクトを復元する必要があります。

DRAWITEMSTRUCT構造の説明については、CWnd::OnDrawItemを参照してください。

MFC CTRLTEST サンプルのコードを次に示します。

// Override DrawItem() to implement drawing for an owner-draw CMenu object.
// CColorMenu is a CMenu-derived class.
void CColorMenu::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
   CDC *pDC = CDC::FromHandle(lpDIS->hDC);
   COLORREF cr = (COLORREF)lpDIS->itemData; // RGB in item data

   if (lpDIS->itemAction & ODA_DRAWENTIRE)
   {
      // Paint the color item in the color requested
      CBrush br(cr);
      pDC->FillRect(&lpDIS->rcItem, &br);
   }

   if ((lpDIS->itemState & ODS_SELECTED) &&
       (lpDIS->itemAction & (ODA_SELECT | ODA_DRAWENTIRE)))
   {
      // item has been selected - hilite frame
      COLORREF crHilite = RGB(255 - GetRValue(cr),
                              255 - GetGValue(cr), 255 - GetBValue(cr));
      CBrush br(crHilite);
      pDC->FrameRect(&lpDIS->rcItem, &br);
   }

   if (!(lpDIS->itemState & ODS_SELECTED) &&
       (lpDIS->itemAction & ODA_SELECT))
   {
      // Item has been de-selected -- remove frame
      CBrush br(cr);
      pDC->FrameRect(&lpDIS->rcItem, &br);
   }
}

CMenu::EnableMenuItem

メニュー項目を有効、無効、または暗くします。

UINT EnableMenuItem(
    UINT nIDEnableItem,
    UINT nEnable);

パラメーター

nIDEnableItem
nEnableによって決定される、有効にするメニュー項目を指定します。 このパラメーターでは、ポップアップ メニュー項目と標準メニュー項目を指定できます。

nEnable
実行するアクションを指定します。 MF_BYCOMMANDまたはMF_BYPOSITIONを使用して、MF_DISABLEDMF_ENABLED、またはMF_GRAYEDを組み合わせて使用できます。 これらの値は、C++ ビットごとの OR 演算子 (|) を使用して結合できます。 これらの値には次の意味があります。

  • MF_BYCOMMAND パラメーターが既存のメニュー項目のコマンド ID を指定することを指定します。 これが既定です。

  • MF_BYPOSITION パラメーターが既存のメニュー項目の位置を指定することを指定します。 最初の項目の位置は 0 です。

  • MF_DISABLED メニュー項目を無効にして、選択できないが暗くしないようにします。

  • MF_ENABLED メニュー項目を選択できるように有効にし、淡色表示の状態から復元します。

  • MF_GRAYED メニュー項目を無効にして選択できないようにし、暗くします。

戻り値

以前の状態 (MF_DISABLEDMF_ENABLED、または MF_GRAYED) または -1 (無効な場合)。

解説

CreateMenuInsertMenuModifyMenu、およびLoadMenuIndirectメンバー関数は、メニュー項目の状態 (有効、無効、または淡色) を設定することもできます。

MF_BYPOSITION値を使用するには、アプリケーションが正しいCMenuを使用する必要があります。 メニュー バーの CMenu を使用すると、最上位レベルのメニュー項目 (メニュー バーの項目) が影響を受けます。 ポップアップ メニューまたは入れ子になったポップアップ メニューの項目の状態を位置別に設定するには、アプリケーションでポップアップ メニューの CMenu を指定する必要があります。

アプリケーションで MF_BYCOMMAND フラグを指定すると、Windows は CMenuに従属するすべてのポップアップ メニュー項目をチェックします。したがって、重複するメニュー項目が存在しない限り、メニュー バーの CMenu を使用するだけで十分です。

// The code fragment below shows how to disable (and gray out) the
// File\New menu item.
// NOTE: m_bAutoMenuEnable is set to FALSE in the constructor of
// CMainFrame so no ON_UPDATE_COMMAND_UI or ON_COMMAND handlers are
// needed, and CMenu::EnableMenuItem() will work as expected.

CMenu *mmenu = GetMenu();
CMenu *submenu = mmenu->GetSubMenu(0);
submenu->EnableMenuItem(ID_FILE_NEW, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);

CMenu::FromHandle

メニューに対する Windows ハンドルを指定 CMenu オブジェクトへのポインターを返します。

static CMenu* PASCAL FromHandle(HMENU hMenu);

パラメーター

hMenu
メニューへの Windows ハンドル。

戻り値

一時的または永続的な CMenu へのポインター。

解説

CMenu オブジェクトがまだ Windows メニュー オブジェクトにアタッチされていない場合は、一時的なCMenu オブジェクトが作成され、アタッチされます。

この一時 CMenu オブジェクトは、アプリケーションがイベント ループで次にアイドル時間を過ぎ、その時点ですべての一時オブジェクトが削除されるまでのみ有効です。

CMenu::CreateMenu の例を参照してください。

CMenu::GetDefaultItem

指定したメニューの既定のメニュー項目を決定します。

UINT GetDefaultItem(
    UINT gmdiFlags,
    BOOL fByPos = FALSE);

パラメーター

gmdiFlags
関数がメニュー項目を検索する方法を指定する値。 このパラメーターには、none、one、または次の値の組み合わせを指定できます。

Value 意味
GMDI_GOINTOPOPUPS 既定の項目がサブメニューを開く項目である場合、関数は対応するサブメニューを再帰的に検索することを指定します。 サブメニューに既定の項目がない場合、戻り値はサブメニューを開く項目を識別します。

既定では、サブメニューを開く項目であるかどうかに関係なく、関数は指定したメニューの最初の既定の項目を返します。
GMDI_USEDISABLED 無効になっている場合でも、関数が既定の項目を返すように指定します。

既定では、この関数は無効または灰色の項目をスキップします。

fByPos
メニュー項目の識別子またはその位置を取得するかどうかを指定する値。 このパラメーターが FALSEの場合は、識別子が返されます。 それ以外の場合は、位置が返されます。

戻り値

関数が成功した場合、戻り値はメニュー項目の識別子または位置です。 関数が失敗した場合、戻り値は - 1 です。

解説

このメンバー関数では、Windows SDK で説明されているように、Win32 関数 GetMenuDefaultItem の動作が実装されます。

CMenu::InsertMenu の例を参照してください。

CMenu::GetMenuContextHelpId

CMenuに関連付けられているコンテキスト ヘルプ ID を取得します。

DWORD GetMenuContextHelpId() const;

戻り値

コンテキスト ヘルプ ID が現在 CMenu 関連付けられている場合は 1 つ、それ以外の場合は 0。

CMenu::InsertMenu の例を参照してください。

CMenu::GetMenuInfo

メニューの情報を取得します。

BOOL GetMenuInfo(LPMENUINFO lpcmi) const;

パラメーター

lpcmi
メニューの情報を含む MENUINFO 構造体へのポインター。

戻り値

関数が成功した場合、戻り値は 0 以外です。それ以外の場合、戻り値は 0 です。

解説

メニューに関する情報を取得するには、この関数を呼び出します。

CMenu::GetMenuItemCount

ポップアップ メニューまたはトップレベル メニュー内の項目の数を決定します。

UINT GetMenuItemCount() const;

戻り値

関数が成功した場合のメニュー内の項目の数。それ以外の場合は -1。

CWnd::GetMenu の例を参照してください。

CMenu::GetMenuItemID

nPosによって定義された位置にあるメニュー項目のメニュー項目識別子を取得します。

UINT GetMenuItemID(int nPos) const;

パラメーター

nPos
ID を取得するメニュー項目の位置 (0 から始まる) を指定します。

戻り値

関数が成功した場合にポップアップ メニューで指定した項目の項目 ID。 指定した項目がポップアップ メニュー (ポップアップ メニュー内の項目ではなく) である場合、戻り値は -1 になります。 nPosSEPARATORメニュー項目に対応する場合、戻り値は 0 になります。

CMenu::InsertMenu の例を参照してください。

CMenu::GetMenuItemInfo

メニュー項目に関する情報を取得します。

BOOL GetMenuItemInfo(
    UINT uItem,
    LPMENUITEMINFO lpMenuItemInfo,
    BOOL fByPos = FALSE);

パラメーター

uItem
情報を取得するメニュー項目の識別子または位置。 このパラメーターの意味は、 ByPosの値によって異なります。

lpMenuItemInfo
Windows SDK で説明されているように、メニューに関する情報を含む MENUITEMINFOへのポインター。

fByPos
nIDItemの意味を指定する値。 既定では、 ByPosFALSE です。これは、uItem がメニュー項目識別子であることを示します。 ByPosFALSEに設定されていない場合は、メニュー項目の位置を示します。

戻り値

関数が成功すると、戻り値は 0 以外になります。 関数が失敗した場合は、0 を返します。 拡張エラー情報を取得するには、Windows SDK で説明されているように、Win32 関数 GetLastErrorを使用します。

解説

このメンバー関数は、Windows SDK で説明されているように、Win32 関数 GetMenuItemInfoの動作を実装します。 GetMenuItemInfoの MFC 実装では、メニューへのハンドルを使用しないことに注意してください。

// CMainFrame::OnToggleTestMenuInfo() is a menu command handler for 
// "Toggle Info" menu item (whose resource id is ID_MENU_TOGGLEINFO). It 
// toggles the checked or unchecked state of the "Toggle Info" menu item.
// CMainFrame is a CFrameWnd-derived class.
void CMainFrame::OnToggleTestMenuItemInfo()
{
   // Get the popup menu which contains the "Toggle Info" menu item.
   CMenu* mmenu = GetMenu();
   CMenu* submenu = mmenu->GetSubMenu(4);

   // Check the state of the "Toggle Info" menu item. Check the menu item
   // if it is currently unchecked. Otherwise, uncheck the menu item
   // if it is not currently checked.
   MENUITEMINFO info;
   info.cbSize = sizeof (MENUITEMINFO); // must fill up this field
   info.fMask = MIIM_STATE;             // get the state of the menu item
   VERIFY(submenu->GetMenuItemInfo(ID_MENU_TOGGLEINFO, &info));

   if (info.fState & MF_CHECKED)
      submenu->CheckMenuItem(ID_MENU_TOGGLEINFO, MF_UNCHECKED | MF_BYCOMMAND);
   else
      submenu->CheckMenuItem(ID_MENU_TOGGLEINFO, MF_CHECKED | MF_BYCOMMAND);
}

CMenu::GetMenuState

指定したメニュー項目の状態またはポップアップ メニューの項目数を返します。

UINT GetMenuState(
    UINT nID,
    UINT nFlags) const;

パラメーター

nID
nFlagsによって決定されるメニュー項目 ID を指定します。

nFlags
nIDの性質を指定します。 次のいずれかの値を指定できます。

  • MF_BYCOMMAND パラメーターが既存のメニュー項目のコマンド ID を指定することを指定します。 これが既定です。

  • MF_BYPOSITION パラメーターが既存のメニュー項目の位置を指定することを指定します。 最初の項目の位置は 0 です。

戻り値

指定した項目が存在しない場合に 0xFFFFFFFF 値。 nIdがポップアップ メニューを識別する場合、上位バイトにはポップアップ メニュー内の項目の数が含まれます。下位バイトには、ポップアップ メニューに関連付けられているメニュー フラグが含まれます。 それ以外の場合、戻り値は、次のリストの値のマスク (ブール OR) です (このマスクは、 nId が識別するメニュー項目の状態を表します)。

  • MF_CHECKED アイテムの横に既定のチェック マークを配置する MF_UNCHECKED を持つトグルとして機能します。 アプリケーションがチェック マーク ビットマップ ( SetMenuItemBitmaps メンバー関数を参照) を提供すると、"チェック マークオン" ビットマップが表示されます。

  • MF_DISABLED メニュー項目を無効にして、選択できないが暗くしないようにします。

  • MF_ENABLED メニュー項目を選択できるように有効にし、淡色表示の状態から復元します。 この定数の値は 0 であることに注意してください。この値を使用する場合、アプリケーションは 0 に対してエラーをテストしないでください。

  • MF_GRAYED メニュー項目を無効にして選択できないようにし、暗くします。

  • MF_MENUBARBREAK 項目を静的メニューの新しい行またはポップアップ メニューの新しい列に配置します。 新しいポップアップ メニュー列は、古い列から垂直分割線で区切ります。

  • MF_MENUBREAK 項目を静的メニューの新しい行またはポップアップ メニューの新しい列に配置します。 列間に分割線は配置されません。

  • MF_SEPARATOR 水平分割線を描画します。 ポップアップ メニューでのみ使用できます。 この線は、淡色表示、無効化、または強調表示できません。 その他のパラメーターは無視されます。

  • MF_UNCHECKED アイテムの横にあるチェック マークを削除する MF_CHECKED のトグルとして機能します。 アプリケーションがチェック マーク ビットマップを提供すると ( SetMenuItemBitmaps メンバー関数を参照)、"チェック マークオフ" ビットマップが表示されます。 この定数の値は 0 であることに注意してください。この値を使用する場合、アプリケーションは 0 に対してエラーをテストしないでください。

// CMainFrame::OnToggleTestMenuState() is a menu command handler for
// "Toggle State" menu item (whose resource id is ID_MENU_TOGGLESTATE).
// It toggles the checked or unchecked state of the "Toggle State" menu item.
// CMainFrame is a CFrameWnd-derived class.
void CMainFrame::OnToggleTestMenuState()
{
   // Get the popup menu which contains the "Toggle State" menu item.
   CMenu *mmenu = GetMenu();
   CMenu *submenu = mmenu->GetSubMenu(4);

   // Check the state of the "Toggle State" menu item. Check the menu item
   // if it is currently unchecked. Otherwise, uncheck the menu item
   // if it is not currently checked.
   UINT state = submenu->GetMenuState(ID_MENU_TOGGLESTATE, MF_BYCOMMAND);
   ASSERT(state != 0xFFFFFFFF);

   if (state & MF_CHECKED)
      submenu->CheckMenuItem(ID_MENU_TOGGLESTATE, MF_UNCHECKED | MF_BYCOMMAND);
   else
      submenu->CheckMenuItem(ID_MENU_TOGGLESTATE, MF_CHECKED | MF_BYCOMMAND);
}

CMenu::GetMenuString

指定したメニュー項目のラベルを指定したバッファーにコピーします。

int GetMenuString(
    UINT nIDItem,
    LPTSTR lpString,
    int nMaxCount,
    UINT nFlags) const;

int GetMenuString(
    UINT nIDItem,
    CString& rString,
    UINT nFlags) const;

パラメーター

nIDItem
nFlagsの値に応じて、メニュー項目の整数識別子またはメニュー内のメニュー項目のオフセットを指定します。

lpString
ラベルを受け取るバッファーを指します。

rString
コピーしたメニュー文字列を受け取る CString オブジェクトへの参照。

nMaxCount
コピーするラベルの最大長 (文字数) を指定します。 ラベルが nMaxCountで指定された最大値より長い場合、余分な文字は切り捨てられます。

nFlags
nIDItem パラメーターの解釈を指定します。 次のいずれかの値を指定できます。

nFlags の解釈 nIDItem
MF_BYCOMMAND パラメーターが既存のメニュー項目のコマンド ID を指定することを指定します。 これは、 MF_BYCOMMANDMF_BYPOSITION も設定されていない場合の既定値です。
MF_BYPOSITION パラメーターが既存のメニュー項目の位置を指定することを指定します。 最初の項目の位置は 0 です。

戻り値

null ターミネータを含めず、バッファーにコピーされる実際の文字数を指定します。

解説

nMaxCountパラメーターは、文字列を終了する null 文字に対応するために、ラベル内の文字数より 1 大きくする必要があります。

CMenu::InsertMenu の例を参照してください。

CMenu::GetSafeHmenu

このCMenu オブジェクトまたはNULL CMenu ポインターによってラップされたHMENUを返します。

HMENU GetSafeHmenu() const;

CMenu::LoadMenu の例を参照してください。

CMenu::GetSubMenu

ポップアップ メニューの CMenu オブジェクトを取得します。

CMenu* GetSubMenu(int nPos) const;

パラメーター

nPos
メニューに含まれるポップアップ メニューの位置を指定します。 最初のメニュー項目の位置の値は 0 から始まります。 この関数では、ポップアップ メニューの識別子を使用できません。

戻り値

指定した位置にポップアップ メニューが存在する場合は、m_hMenu メンバーにポップアップ メニューへのハンドルが含まれるCMenu オブジェクトへのポインター。それ以外の場合はNULLCMenu オブジェクトが存在しない場合は、一時的なオブジェクトが作成されます。 返される CMenu ポインターは格納しないでください。

CMenu::TrackPopupMenu の例を参照してください。

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 メンバー関数を参照してください。 複数の値を指定するには、ビットごとの OR 演算子を使用して、 MF_BYCOMMAND または MF_BYPOSITION フラグと組み合わせます。

nIDNewItem
新しいメニュー項目のコマンド ID を指定するか、 nFlagsMF_POPUPに設定されている場合は、ポップアップ メニューのメニュー ハンドル (HMENU) を指定します。 nFlagsMF_SEPARATOR に設定されている場合、nIDNewItem パラメーターは無視されます (不要)。

lpszNewItem
新しいメニュー項目の内容を指定します。 nFlags は、次の方法で lpszNewItem を解釈するために使用できます。

nFlags の解釈 lpszNewItem
MF_OWNERDRAW メニュー項目に関連付けられた追加データを維持するためにアプリケーションが使用できる、アプリケーション提供の 32 ビット値が含まれます。 この 32 ビット値は、WM_MEASUREITEMおよびWM_DRAWITEMメッセージによって提供される構造体のitemData メンバー内のアプリケーションで使用できます。 これらのメッセージは、メニュー項目が最初に表示または変更されたときに送信されます。
MF_STRING null で終わる文字列への長いポインターを格納します。 これが既定の解釈です。
MF_SEPARATOR lpszNewItem パラメーターは無視されます (不要)。

pBmp
メニュー項目として使用される CBitmap オブジェクトを指します。

戻り値

正常終了した場合は 0 以外を返します。それ以外の場合は 0 を返します。

解説

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

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

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

アクティブな複数ドキュメント インターフェイス (MDI) 子ウィンドウが最大化され、アプリケーションがこの関数を呼び出して MF_BYPOSITION フラグを指定して、MDI アプリケーションのメニューにポップアップ メニューを挿入する場合、メニューは予想よりも 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;
}

CMenu::InsertMenuItem

メニュー内の指定した位置に新しいメニュー項目を挿入します。

BOOL InsertMenuItem(
    UINT uItem,
    LPMENUITEMINFO lpMenuItemInfo,
    BOOL fByPos = FALSE);

パラメーター

uItem
Windows SDK のInsertMenuItemuItemの説明を参照してください。

lpMenuItemInfo
Windows SDK のInsertMenuItemlpmiiの説明を参照してください。

fByPos
Windows SDK のInsertMenuItemfByPositionの説明を参照してください。

解説

この関数は、Windows SDK で説明されている InsertMenuItemをラップします。

CMenu::LoadMenu

アプリケーションの実行可能ファイルからメニュー リソースを読み込み、 CMenu オブジェクトにアタッチします。

BOOL LoadMenu(LPCTSTR lpszResourceName);
BOOL LoadMenu(UINT nIDResource);

パラメーター

lpszResourceName
読み込むメニュー リソースの名前を含む null で終わる文字列を指します。

nIDResource
読み込むメニュー リソースのメニュー ID を指定します。

戻り値

メニュー リソースが正常に読み込まれた場合は 0 以外。それ以外の場合は 0。

解説

終了する前に、メニューがウィンドウに割り当てられない場合、アプリケーションはメニューに関連付けられているシステム リソースを解放する必要があります。 アプリケーションは、 DestroyMenu メンバー関数を呼び出すことによってメニューを解放します。

// CMainFrame::OnReplaceMenu() is a menu command handler for CMainFrame
// class, which in turn is a CFrameWnd-derived class. It loads a new
// menu resource and replaces the SDI application window's menu bar with
// this new menu. CMainFrame is a CFrameWnd-derived class.
void CMainFrame::OnReplaceMenu()
{
   // Load the new menu.
   m_ShortMenu.LoadMenu(IDR_SHORT_MENU);
   ASSERT(m_ShortMenu);

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

   // Add the new menu
   SetMenu(&m_ShortMenu);

   // Assign default menu
   m_hMenuDefault = m_ShortMenu.GetSafeHmenu(); // or m_ShortMenu.m_hMenu;
}

CMenu::LoadMenuIndirect

メモリ内のメニュー テンプレートからリソースを読み込み、 CMenu オブジェクトにアタッチします。

BOOL LoadMenuIndirect(const void* lpMenuTemplate);

パラメーター

lpMenuTemplate
メニュー テンプレート (1 つの MENUITEMTEMPLATEHEADER 構造体と 1 つ以上の MENUITEMTEMPLATE 構造体のコレクション) を指します。 これら 2 つの構造の詳細については、Windows SDK を参照してください。

戻り値

メニュー リソースが正常に読み込まれた場合は 0 以外。それ以外の場合は 0。

解説

メニュー テンプレートは、ヘッダーの後に 1 つ以上の MENUITEMTEMPLATE 構造体のコレクションが続きます。各構造体には、1 つ以上のメニュー項目とポップアップ メニューが含まれている場合があります。

バージョン番号は 0 にする必要があります。

mtOption フラグには、ポップアップ リストの最後の項目とメイン リストの最後の項目のMF_ENDが含まれている必要があります。 その他のフラグについては、 AppendMenu メンバー関数を参照してください。 mtOptionMF_POPUPが指定されている場合は、mtId メンバーをMENUITEMTEMPLATE構造体から省略する必要があります。

MENUITEMTEMPLATE構造体に割り当てられる領域は、メニュー項目の名前を null で終わる文字列としてmtStringが格納するのに十分な大きさである必要があります。

終了する前に、メニューがウィンドウに割り当てられない場合、アプリケーションはメニューに関連付けられているシステム リソースを解放する必要があります。 アプリケーションは、 DestroyMenu メンバー関数を呼び出すことによってメニューを解放します。

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

CMenu::m_hMenu

CMenu オブジェクトにアタッチされている Windows メニューのHMENU ハンドルを指定します。

HMENU m_hMenu;

CMenu::LoadMenu の例を参照してください。

CMenu::MeasureItem

所有者描画スタイルのメニューが作成されるときにフレームワークによって呼び出されます。

virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);

パラメーター

lpMeasureItemStruct
MEASUREITEMSTRUCT 構造体へのポインター。

解説

既定では、このメンバー関数は何も行いません。 このメンバー関数をオーバーライドし、メニューのディメンションを Windows に通知する MEASUREITEMSTRUCT 構造体を入力します。

MEASUREITEMSTRUCT構造の説明については、CWnd::OnMeasureItemを参照してください。

MFC CTRLTEST サンプルのコードを次に示します。

// Override MeasureItem() to return the size of the menu item.
// CColorMenu is a CMenu-derived class.

#define COLOR_BOX_WIDTH 20
#define COLOR_BOX_HEIGHT 20

void CColorMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
{
   // all items are of fixed size
   lpMIS->itemWidth = COLOR_BOX_WIDTH;
   lpMIS->itemHeight = COLOR_BOX_HEIGHT;
}

CMenu::ModifyMenu

nPositionで指定した位置にある既存のメニュー項目を変更します。

BOOL ModifyMenu(
    UINT nPosition,
    UINT nFlags,
    UINT_PTR nIDNewItem = 0,
    LPCTSTR lpszNewItem = NULL);

BOOL ModifyMenu(
    UINT nPosition,
    UINT nFlags,
    UINT_PTR nIDNewItem,
    const CBitmap* pBmp);

パラメーター

nPosition
変更するメニュー項目を指定します。 nFlags パラメーターを使用すると、次の方法でnPositionを解釈できます。

nFlags の解釈 nPosition
MF_BYCOMMAND パラメーターが既存のメニュー項目のコマンド ID を指定することを指定します。 これは、 MF_BYCOMMANDMF_BYPOSITION も設定されていない場合の既定値です。
MF_BYPOSITION パラメーターが既存のメニュー項目の位置を指定することを指定します。 最初の項目の位置は 0 です。

nFlags
nPositionの解釈方法を指定し、メニュー項目に加える変更に関する情報を提供します。 設定できるフラグの一覧については、 AppendMenu メンバー関数を参照してください。

nIDNewItem
変更したメニュー項目のコマンド ID、または nFlagsMF_POPUPに設定されている場合は、ポップアップ メニューのメニュー ハンドル (HMENU) を指定します。 nFlagsMF_SEPARATOR に設定されている場合、nIDNewItem パラメーターは無視されます (不要)。

lpszNewItem
新しいメニュー項目の内容を指定します。 nFlags パラメーターを使用すると、次の方法でlpszNewItemを解釈できます。

nFlags の解釈 lpszNewItem
MF_OWNERDRAW メニュー項目に関連付けられた追加データを維持するためにアプリケーションが使用できる、アプリケーション提供の 32 ビット値が含まれます。 この 32 ビット値は、 MF_MEASUREITEMMF_DRAWITEMを処理するときにアプリケーションで使用できます。
MF_STRING null で終わる文字列または CStringへの長いポインターを格納します。
MF_SEPARATOR lpszNewItem パラメーターは無視されます (不要)。

pBmp
メニュー項目として使用される CBitmap オブジェクトを指します。

戻り値

正常終了した場合は 0 以外を返します。それ以外の場合は 0 を返します。

解説

アプリケーションは、 nFlagsの値を設定して、メニュー項目の新しい状態を指定します。 この関数は、メニュー項目に関連付けられているポップアップ メニューを置き換えると、古いポップアップ メニューを破棄し、ポップアップ メニューで使用されるメモリを解放します。

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

ウィンドウに存在するメニューが変更されるたびに (ウィンドウが表示されるかどうかにかかわらず)、アプリケーションは CWnd::DrawMenuBarを呼び出す必要があります。 既存のメニュー項目の属性を変更するには、 CheckMenuItem および EnableMenuItem メンバー関数を使用する方がはるかに高速です。

CMenu::InsertMenu の例を参照してください。

CMenu::operator HMENU

この演算子を使用して、 CMenu オブジェクトのハンドルを取得します。

operator HMENU() const;

戻り値

成功した場合は、 CMenu オブジェクトのハンドル。それ以外の場合は NULL

解説

このハンドルを使用して、Windows API を直接呼び出すことができます。

CMenu::operator !=

2 つのメニューが論理的に等しくないかどうかを判断します。

BOOL operator!=(const CMenu& menu) const;

パラメーター

menu
比較対象の CMenu オブジェクトです。

解説

左側のメニュー オブジェクトが右側のメニュー オブジェクトと等しくないかどうかをテストします。

CMenu::operator ==

2 つのメニューが論理的に等しいかどうかを判断します。

BOOL operator==(const CMenu& menu) const;

パラメーター

menu
比較対象の CMenu オブジェクトです。

解説

左側のメニュー オブジェクトが ( HMENU 値の観点から) 右側のメニュー オブジェクトと等しいかどうかをテストします。

CMenu::RemoveMenu

関連付けられたポップアップ メニューを含むメニュー項目をメニューから削除します。

BOOL RemoveMenu(
    UINT nPosition,
    UINT nFlags);

パラメーター

nPosition
削除するメニュー項目を指定します。 nFlags パラメーターを使用すると、次の方法でnPositionを解釈できます。

nFlags の解釈 nPosition
MF_BYCOMMAND パラメーターが既存のメニュー項目のコマンド ID を指定することを指定します。 これは、 MF_BYCOMMANDMF_BYPOSITION も設定されていない場合の既定値です。
MF_BYPOSITION パラメーターが既存のメニュー項目の位置を指定することを指定します。 最初の項目の位置は 0 です。

nFlags
nPositionの解釈方法を指定します。

戻り値

正常終了した場合は 0 以外を返します。それ以外の場合は 0 を返します。

解説

ポップアップ メニューのハンドルは破棄されないため、メニューを再利用できます。 この関数を呼び出す前に、アプリケーションは GetSubMenu メンバー関数を呼び出して、再利用のためにポップアップ CMenu オブジェクトを取得できます。

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

CMenu::InsertMenu の例を参照してください。

CMenu::SetDefaultItem

指定したメニューの既定のメニュー項目を設定します。

BOOL SetDefaultItem(
    UINT uItem,
    BOOL fByPos = FALSE);

パラメーター

uItem
新しい既定のメニュー項目の識別子または位置。既定の項目がない場合は -1。 このパラメーターの意味は、 fByPosの値によって異なります。

fByPos
uItemの意味を指定する値。 このパラメーターが FALSEの場合、 uItem はメニュー項目識別子です。 それ以外の場合は、メニュー項目の位置になります。

戻り値

関数が成功すると、戻り値は 0 以外になります。 関数が失敗した場合は、0 を返します。 拡張エラー情報を取得するには、Windows SDK で説明されているように、Win32 関数 GetLastErrorを使用します。

解説

このメンバー関数では、Windows SDK で説明されているように、Win32 関数 SetMenuDefaultItem の動作が実装されます。

CMenu::InsertMenu の例を参照してください。

CMenu::SetMenuContextHelpId

コンテキスト ヘルプ ID を CMenuに関連付けます。

BOOL SetMenuContextHelpId(DWORD dwContextHelpId);

パラメーター

dwContextHelpId
CMenuに関連付けるコンテキスト ヘルプ ID。

戻り値

成功した場合は 0 以外。それ以外の場合は 0

解説

メニュー内のすべての項目がこの識別子を共有します。個々のメニュー項目にヘルプ コンテキスト識別子を添付することはできません。

CMenu::InsertMenu の例を参照してください。

CMenu::SetMenuInfo

メニューの情報を設定します。

BOOL SetMenuInfo(LPCMENUINFO lpcmi);

パラメーター

lpcmi
メニューの情報を含む MENUINFO 構造体へのポインター。

戻り値

関数が成功した場合、戻り値は 0 以外です。それ以外の場合、戻り値は 0 です。

解説

メニューに関する特定の情報を設定するには、この関数を呼び出します。

CMenu::SetMenuItemBitmaps

指定したビットマップをメニュー項目に関連付けます。

BOOL SetMenuItemBitmaps(
    UINT nPosition,
    UINT nFlags,
    const CBitmap* pBmpUnchecked,
    const CBitmap* pBmpChecked);

パラメーター

nPosition
変更するメニュー項目を指定します。 nFlags パラメーターを使用すると、次の方法でnPositionを解釈できます。

nFlags nPosition の解釈
MF_BYCOMMAND パラメーターが既存のメニュー項目のコマンド ID を指定することを指定します。 これは、 MF_BYCOMMANDMF_BYPOSITION も設定されていない場合の既定値です。
MF_BYPOSITION パラメーターが既存のメニュー項目の位置を指定することを指定します。 最初の項目の位置は 0 です。

nFlags
nPositionの解釈方法を指定します。

pBmpUnchecked
チェックされていないメニュー項目に使用するビットマップを指定します。

pBmpChecked
オンになっているメニュー項目に使用するビットマップを指定します。

戻り値

正常終了した場合は 0 以外を返します。それ以外の場合は 0 を返します。

解説

メニュー項目がオンかオフかに関係なく、Windows はメニュー項目の横に適切なビットマップを表示します。

pBmpUncheckedまたはpBmpCheckedNULLされている場合、Windows は対応する属性のメニュー項目の横に何も表示しません。 両方のパラメーターが NULLされている場合、Windows は、アイテムがオンのときに既定のチェック マークを使用し、アイテムがオフのときにチェック マークを削除します。

メニューが破棄されると、これらのビットマップは破棄されません。アプリケーションはそれらを破棄する必要があります。

Windows GetMenuCheckMarkDimensions 関数は、メニュー項目に使用される既定のチェック マークの寸法を取得します。 アプリケーションでは、これらの値を使用して、この関数で提供されるビットマップの適切なサイズを決定します。 サイズを取得し、ビットマップを作成して設定します。

// The code fragment below is from CMainFrame::OnCreate and shows
// how to associate bitmaps with the "Bitmap" menu item.
// Whether the "Bitmap" menu item is checked or unchecked, Windows
// displays the appropriate bitmap next to the menu item. Both
// IDB_CHECKBITMAP and IDB_UNCHECKBITMAP bitmaps are loaded
// in OnCreate() and destroyed in the destructor of CMainFrame class.
// CMainFrame is a CFrameWnd-derived class.

// Load bitmaps from resource. Both m_CheckBitmap and m_UnCheckBitmap
// are member variables of CMainFrame class of type CBitmap.
ASSERT(m_CheckBitmap.LoadBitmap(IDB_CHECKBITMAP));
ASSERT(m_UnCheckBitmap.LoadBitmap(IDB_UNCHECKBITMAP));

// Associate bitmaps with the "Bitmap" menu item.
CMenu *mmenu = GetMenu();
CMenu *submenu = mmenu->GetSubMenu(4);
ASSERT(submenu->SetMenuItemBitmaps(ID_MENU_BITMAP, MF_BYCOMMAND,
                                   &m_CheckBitmap, &m_UnCheckBitmap));

 

// This code fragment is taken from CMainFrame::~CMainFrame

// Destroy the bitmap objects if they are loaded successfully
// in OnCreate().
if (m_CheckBitmap.m_hObject)
   m_CheckBitmap.DeleteObject();

if (m_UnCheckBitmap.m_hObject)
   m_UnCheckBitmap.DeleteObject();

CMenu::SetMenuItemInfo

メニュー項目に関する情報を変更します。

BOOL SetMenuItemInfo(
    UINT uItem,
    LPMENUITEMINFO lpMenuItemInfo,
    BOOL fByPos = FALSE);

パラメーター

uItem
Windows SDK のSetMenuItemInfouItemの説明を参照してください。

lpMenuItemInfo
Windows SDK のSetMenuItemInfolpmiiの説明を参照してください。

fByPos
Windows SDK のSetMenuItemInfofByPositionの説明を参照してください。

解説

この関数は、Windows SDK で説明されている SetMenuItemInfoをラップします。

CMenu::TrackPopupMenu

指定した場所にフローティング ポップアップ メニューを表示し、ポップアップ メニューの項目の選択を追跡します。

BOOL TrackPopupMenu(
    UINT nFlags,
    int x,
    int y,
    CWnd* pWnd,
    LPCRECT lpRect = 0);

パラメーター

nFlags
画面位置フラグとマウス位置フラグを指定します。 使用可能なフラグの一覧については、 TrackPopupMenu を参照してください。

x
ポップアップ メニューの画面座標の水平方向の位置を指定します。 nFlagsパラメーターの値に応じて、メニューは左揃え、右揃え、またはこの位置を基準とした中央揃えにできます。

y
画面のメニューの上部の画面座標の垂直方向の位置を指定します。

pWnd
ポップアップ メニューを所有するウィンドウを識別します。 TPM_NONOTIFY フラグが指定されている場合でも、このパラメーターをNULLすることはできません。 このウィンドウは、メニューからすべての WM_COMMAND メッセージを受信します。 Windows バージョン 3.1 以降では、ウィンドウはTrackPopupMenuが戻るまでWM_COMMANDメッセージを受信しません。 Windows 3.0 では、ウィンドウはTrackPopupMenu戻る前にWM_COMMANDメッセージを受信します。

lpRect
無視されます。

戻り値

このメソッドは、Windows SDK で TrackPopupMenu を呼び出した結果を返します。

解説

フローティング ポップアップ メニューは、画面上の任意の場所に表示できます。

// The code fragment shows how to get the File menu from the
// application window and displays it as a floating popup menu
// when the right mouse button is clicked in view.
// CMdiView is a CView-derived class.
void CMdiView::OnRButtonDown(UINT nFlags, CPoint point)
{
   CView::OnRButtonDown(nFlags, point);

   CMenu *menu_bar = AfxGetMainWnd()->GetMenu();
   CMenu *file_menu = menu_bar->GetSubMenu(0);
   ASSERT(file_menu);

   ClientToScreen(&point);
   file_menu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x,
                             point.y, this);
}

CMenu::TrackPopupMenuEx

指定した場所にフローティング ポップアップ メニューを表示し、ポップアップ メニューの項目の選択を追跡します。

BOOL TrackPopupMenuEx(
    UINT fuFlags,
    int x,
    int y,
    CWnd* pWnd,
    LPTPMPARAMS lptpm);

パラメーター

fuFlags
拡張メニューのさまざまな関数を指定します。 すべての値とその意味の一覧については、 TrackPopupMenuExを参照してください。

x
ポップアップ メニューの画面座標の水平方向の位置を指定します。

y
画面のメニューの上部の画面座標の垂直方向の位置を指定します。

pWnd
ポップアップ メニューを所有し、作成されたメニューからメッセージを受信するウィンドウへのポインター。 このウィンドウには、現在のアプリケーションの任意のウィンドウを指定できますが、 NULLすることはできません。 fuFlags パラメーターにTPM_NONOTIFYを指定した場合、関数はメッセージをpWndに送信しません。 WM_COMMAND メッセージを受信するには、pWndが指すウィンドウに対して関数が戻る必要があります。

lptpm
メニューが重ならないように画面の領域を指定する TPMPARAMS 構造体へのポインター。 このパラメーターは、NULL に設定できます。

戻り値

fuFlags パラメーターにTPM_RETURNCMDを指定した場合、戻り値はユーザーが選択した項目のメニュー項目識別子です。 ユーザーが選択を行わずにメニューをキャンセルした場合、またはエラーが発生した場合、戻り値は 0 になります。

fuFlags パラメーターにTPM_RETURNCMDを指定しない場合、関数が成功した場合は戻り値は 0 以外になり、失敗した場合は 0 になります。 拡張されたエラー情報を取得するには、GetLastError を呼び出します。

解説

フローティング ポップアップ メニューは、画面上の任意の場所に表示できます。 ポップアップ メニューの作成時のエラー処理の詳細については、「 TrackPopupMenuEx」を参照してください。

関連項目

MFC サンプル CTRLTEST
MFC サンプル DYNAMENU
CObject クラス
階層図