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 メンバー関数によって作成されたすべての一時 CMenu オブジェクトを FromHandle 削除します。
CMenu::DestroyMenu オブジェクトにアタッチされているメニューを CMenu 破棄し、メニューが占有していたメモリを解放します。
CMenu::Detach Windows メニュー ハンドルをオブジェクトから CMenu デタッチし、ハンドルを返します。
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 オブジェクトにアタッチされている Windows メニューへのハンドルを CMenu 指定します。

解説

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

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

メンバー関数を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 を指定するか、またはに設定MF_POPUPされている場合nFlagsは、ポップアップ メニューのメニュー ハンドル (HMENU) を指定します。 に設定MF_SEPARATORされている場合nFlags、パラメーターはnIDNewItem無視されます (不要)。

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

nFlags の解釈 lpszNewItem
MF_OWNERDRAW メニュー項目に関連付けられた追加のデータをメインするためにアプリケーションが使用できる、アプリケーション提供の 32 ビット値が含まれます。 この 32 ビット値は、アプリケーションが処理およびWM_DRAWITEMメッセージを処理WM_MEASUREITEMするときに使用できます。 値は、それらのメッセージと共に 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_MENUBARBREAK および MF_MENUBREAK

  • MF_CHECKED および MF_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_UNCHECKEDフラグをMF_BYCOMMANDMF_CHECKEDMF_BYPOSITION指定できます。 これらのフラグは、ビットごとの OR 演算子を使用して結合できます。 次の意味があります。

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

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

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

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

戻り値

項目の以前の状態。MF_CHECKEDまたはMF_UNCHECKED0xFFFFFFFF、メニュー項目が存在しなかった場合。

解説

パラメーターは 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();

解説

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

CMenu::CreateMenu

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

BOOL CreateMenu();

戻り値

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

解説

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

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

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

解説

メニューは最初は空です。 メニュー項目は、またはInsertMenuメンバー関数をAppendMenu使用して追加できます。 アプリケーションは、既存のメニューまたはポップアップ メニューにポップアップ メニューを追加できます。 このメンバー関数を 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 自動的に呼び出され、メンバー関数によって作成されたすべての一時 CMenu オブジェクトが FromHandle 削除されます。

static void PASCAL DeleteTempMap();

解説

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

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

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

HMENU Detach();

戻り値

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

解説

データ メンバーが m_hMenuNULL設定されています。

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 種類に関する情報を含む構造体へのポインター。

解説

構造体のメンバーは itemActionDRAWITEMSTRUCT 実行する描画アクションを定義します。 所有者描画 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_DISABLEDMF_ENABLED、または MF_BYPOSITIONMF_GRAYEDMF_BYCOMMAND 、または . これらの値は、C++ ビットごとの OR 演算子 (|) を使用して結合できます。 これらの値には次の意味があります。

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

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

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

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

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

戻り値

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

解説

InsertMenuCreateMenuModifyMenuおよび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 ハンドル。

戻り値

一時的または永続的な A への 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 になります。 メニュー項目に対応するSEPARATOR場合nPos、戻り値は 0 です。

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

CMenu::GetMenuItemInfo

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

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

パラメーター

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

lpMenuItemInfo
Windows SDK の説明に従って、メニューに関する情報を含む a への MENUITEMINFOポインター。

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

戻り値

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

解説

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

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

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

HMENU GetSafeHmenu() const;

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

CMenu::GetSubMenu

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

CMenu* GetSubMenu(int nPos) const;

パラメーター

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

戻り値

ポップアップ メニューがm_hMenu特定のCMenu位置に存在する場合は、そのメンバーにポップアップ メニューへのハンドルが含まれているオブジェクトへのポインター。それ以外の場合は < a0/& NULLです。 オブジェクトが CMenu 存在しない場合は、一時的なオブジェクトが作成されます。 返されるポインターは 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 です。 -1 の場合 nPosition 、新しいメニュー項目がメニューの末尾に追加されます。

nFlags
解釈方法 nPosition を指定し、新しいメニュー項目がメニューに追加されたときの状態に関する情報を指定します。 設定できるフラグの一覧については、メンバー関数を AppendMenu 参照してください。 複数の値を指定するには、ビットごとの OR 演算子を使用して、それらを or MF_BYPOSITION フラグとMF_BYCOMMAND組み合わせます。

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

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

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

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

戻り値

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

解説

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

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

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

アクティブな複数ドキュメント インターフェイス (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;
}

CMenu::InsertMenuItem

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

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

パラメーター

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

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

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

解説

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

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 つの構造体と 1 MENUITEMTEMPLATEHEADER つ以上 MENUITEMTEMPLATE の構造体のコレクション) をポイントします。 これら 2 つの構造の詳細については、Windows SDK を参照してください。

戻り値

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

解説

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

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

フラグにはmtOption、ポップアップ リストの最後の項目と、メイン リストの最後の項目に含めるMF_END必要があります。 他のフラグについては、 AppendMenu メンバー関数を参照してください。 で指定mtOptionされている場合MF_POPUPmtId構造体からメンバーを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

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

HMENU m_hMenu;

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

CMenu::MeasureItem

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

virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);

パラメーター

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

解説

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

構造の説明については、以下を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 を指定するか、またはに設定MF_POPUPされている場合nFlagsは、ポップアップ メニューのメニュー ハンドル (HMENU) を指定します。 に設定MF_SEPARATORされている場合nFlags、パラメーターは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す必要があります。 既存のメニュー項目の属性を変更するには、およびEnableMenuItemメンバー関数を使用する方がCheckMenuItemはるかに高速です。

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を指定する値。 このパラメーターが 、uItemの場合はFALSEメニュー項目識別子です。 それ以外の場合は、メニュー項目の位置になります。

戻り値

関数が成功すると、戻り値は 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 はメニュー項目の横に適切なビットマップを表示します。

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

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

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
uItem Windows SDK の説明SetMenuItemInfoを参照してください。

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

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

解説

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

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。 パラメーターで指定 TPM_NONOTIFY した fuFlags 場合、関数はメッセージ pWndを送信しません。 この関数は、メッセージを受信WM_COMMANDするために、指定されたウィンドウにpWnd対して戻る必要があります。

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

戻り値

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

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

解説

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

関連項目

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