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
の呼び出しによってリソースから作成されたメニューはより簡単に管理でき、メニュー リソース自体はメニュー エディターで作成および変更できます。
継承階層
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 を指定するか、 nFlags
が MF_POPUP
に設定されている場合は、ポップアップ メニューのメニュー ハンドル (HMENU
) を指定します。 nFlags
が MF_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_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_CHECKED
またはMF_UNCHECKED
とMF_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
nIDFirst
、nIDLast
、およびnIDItem
の解釈を次のように指定します。
nFlags | 解釈 |
---|---|
MF_BYCOMMAND |
パラメーターが既存のメニュー項目のコマンド ID を指定することを指定します。 これは、 MF_BYCOMMAND も MF_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_BYCOMMAND も MF_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_DISABLED
、MF_ENABLED
、またはMF_GRAYED
を組み合わせて使用できます。 これらの値は、C++ ビットごとの OR 演算子 (|
) を使用して結合できます。 これらの値には次の意味があります。
MF_BYCOMMAND
パラメーターが既存のメニュー項目のコマンド ID を指定することを指定します。 これが既定です。MF_BYPOSITION
パラメーターが既存のメニュー項目の位置を指定することを指定します。 最初の項目の位置は 0 です。MF_DISABLED
メニュー項目を無効にして、選択できないが暗くしないようにします。MF_ENABLED
メニュー項目を選択できるように有効にし、淡色表示の状態から復元します。MF_GRAYED
メニュー項目を無効にして選択できないようにし、暗くします。
戻り値
以前の状態 (MF_DISABLED
、 MF_ENABLED
、または MF_GRAYED
) または -1 (無効な場合)。
解説
CreateMenu
、InsertMenu
、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 ハンドル。
戻り値
一時的または永続的な 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 になります。 nPos
がSEPARATOR
メニュー項目に対応する場合、戻り値は 0 になります。
例
CMenu::InsertMenu
の例を参照してください。
CMenu::GetMenuItemInfo
メニュー項目に関する情報を取得します。
BOOL GetMenuItemInfo(
UINT uItem,
LPMENUITEMINFO lpMenuItemInfo,
BOOL fByPos = FALSE);
パラメーター
uItem
情報を取得するメニュー項目の識別子または位置。 このパラメーターの意味は、 ByPos
の値によって異なります。
lpMenuItemInfo
Windows SDK で説明されているように、メニューに関する情報を含む MENUITEMINFO
へのポインター。
fByPos
nIDItem
の意味を指定する値。 既定では、 ByPos
は FALSE
です。これは、uItem がメニュー項目識別子であることを示します。 ByPos
がFALSE
に設定されていない場合は、メニュー項目の位置を示します。
戻り値
関数が成功すると、戻り値は 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_BYCOMMAND も MF_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
オブジェクトへのポインター。それ以外の場合は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 です。 nPosition が -1 の場合、新しいメニュー項目がメニューの末尾に追加されます。 |
nFlags
nPosition
の解釈方法を指定し、新しいメニュー項目がメニューに追加されたときの状態に関する情報を指定します。 設定できるフラグの一覧については、 AppendMenu
メンバー関数を参照してください。 複数の値を指定するには、ビットごとの OR 演算子を使用して、 MF_BYCOMMAND
または MF_BYPOSITION
フラグと組み合わせます。
nIDNewItem
新しいメニュー項目のコマンド ID を指定するか、 nFlags
が MF_POPUP
に設定されている場合は、ポップアップ メニューのメニュー ハンドル (HMENU
) を指定します。 nFlags
が MF_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 のInsertMenuItem
のuItem
の説明を参照してください。
lpMenuItemInfo
Windows SDK のInsertMenuItem
のlpmii
の説明を参照してください。
fByPos
Windows SDK のInsertMenuItem
のfByPosition
の説明を参照してください。
解説
この関数は、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
メンバー関数を参照してください。 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
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_BYCOMMAND も MF_BYPOSITION も設定されていない場合の既定値です。 |
MF_BYPOSITION |
パラメーターが既存のメニュー項目の位置を指定することを指定します。 最初の項目の位置は 0 です。 |
nFlags
nPosition
の解釈方法を指定し、メニュー項目に加える変更に関する情報を提供します。 設定できるフラグの一覧については、 AppendMenu
メンバー関数を参照してください。
nIDNewItem
変更したメニュー項目のコマンド ID、または nFlags
が MF_POPUP
に設定されている場合は、ポップアップ メニューのメニュー ハンドル (HMENU
) を指定します。 nFlags
が MF_SEPARATOR
に設定されている場合、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
を呼び出す必要があります。 既存のメニュー項目の属性を変更するには、 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_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
の意味を指定する値。 このパラメーターが 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_BYCOMMAND も MF_BYPOSITION も設定されていない場合の既定値です。 |
MF_BYPOSITION |
パラメーターが既存のメニュー項目の位置を指定することを指定します。 最初の項目の位置は 0 です。 |
nFlags
nPosition
の解釈方法を指定します。
pBmpUnchecked
チェックされていないメニュー項目に使用するビットマップを指定します。
pBmpChecked
オンになっているメニュー項目に使用するビットマップを指定します。
戻り値
正常終了した場合は 0 以外を返します。それ以外の場合は 0 を返します。
解説
メニュー項目がオンかオフかに関係なく、Windows はメニュー項目の横に適切なビットマップを表示します。
pBmpUnchecked
またはpBmpChecked
がNULL
されている場合、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 のSetMenuItemInfo
のuItem
の説明を参照してください。
lpMenuItemInfo
Windows SDK のSetMenuItemInfo
のlpmii
の説明を参照してください。
fByPos
Windows SDK のSetMenuItemInfo
のfByPosition
の説明を参照してください。
解説
この関数は、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
」を参照してください。