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
によってリソースから作成されたメニューはより簡単にメイン、メニュー リソース自体はメニュー エディターで作成および変更できます。
継承階層
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_STRING
MF_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_DISABLED
、MF_ENABLED
、MF_GRAYED
MF_STRING
、MF_OWNERDRAW
、MF_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_BYCOMMAND
MF_CHECKED
MF_BYPOSITION
指定できます。 これらのフラグは、ビットごとの 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
の解釈nIDFirst
nIDLast
を指定し、nIDItem
次の方法で指定します。
nFlags | 解釈 |
---|---|
MF_BYCOMMAND |
パラメーターが既存のメニュー項目のコマンド ID を指定することを指定します。 これは、どちらも設定されていないMF_BYCOMMAND MF_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_BYCOMMAND MF_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_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
種類に関する情報を含む構造体へのポインター。
解説
構造体のメンバーは itemAction
、 DRAWITEMSTRUCT
実行する描画アクションを定義します。 所有者描画 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_DISABLED
MF_ENABLED
、または MF_BYPOSITION
MF_GRAYED
MF_BYCOMMAND
、または . これらの値は、C++ ビットごとの OR 演算子 (|
) を使用して結合できます。 これらの値には次の意味があります。
MF_BYCOMMAND
パラメーターが既存のメニュー項目のコマンド ID を指定することを指定します。 これが既定です。MF_BYPOSITION
パラメーターが既存のメニュー項目の位置を指定することを指定します。 最初の項目の位置は 0 です。MF_DISABLED
メニュー項目を無効にして、選択できないが暗くしないようにします。MF_ENABLED
メニュー項目を選択できるように有効にし、淡色表示の状態から復元します。MF_GRAYED
メニュー項目を無効にして選択できないようにし、暗くします。
戻り値
以前の状態 (MF_DISABLED
、または MF_ENABLED
) または MF_GRAYED
-1 (無効な場合)。
解説
InsertMenu
、CreateMenu
、ModifyMenu
および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_BYCOMMAND MF_BYPOSITION 場合の既定値です。 |
MF_BYPOSITION |
パラメーターが既存のメニュー項目の位置を指定することを指定します。 最初の項目の位置は 0 です。 |
戻り値
null ターミネータを含めず、バッファーにコピーされる実際の文字数を指定します。
解説
パラメーターは nMaxCount
、文字列を終了する null 文字に対応するために、ラベル内の文字数より 1 大きくする必要があります。
例
CMenu::InsertMenu
の例を参照してください。
CMenu::GetSafeHmenu
HMENU
このCMenu
オブジェクトまたはポインターによってラップされたオブジェクトをNULL
CMenu
返します。
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_BYCOMMAND MF_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_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
オブジェクトに 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_BYCOMMAND MF_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_MEASUREITEM MF_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_BYCOMMAND MF_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_BYCOMMAND MF_BYPOSITION 場合の既定値です。 |
MF_BYPOSITION |
パラメーターが既存のメニュー項目の位置を指定することを指定します。 最初の項目の位置は 0 です。 |
nFlags
解釈方法 nPosition
を指定します。
pBmpUnchecked
チェックされていないメニュー項目に使用するビットマップを指定します。
pBmpChecked
チェックメニュー項目に使用するビットマップを指定します。
戻り値
正常終了した場合は 0 以外を返します。それ以外の場合は 0 を返します。
解説
メニュー項目がチェックされているかチェックされていないかにかかわらず、Windows はメニュー項目の横に適切なビットマップを表示します。
いずれかpBmpUnchecked
pBmpChecked
である場合は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
。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示