MF_BYCOMMAND

DeleteMenuの第3引数としてMF_BYCOMMANDを指定すると、第2引数に指定したコマンドIDのメニューアイテムを削除する。

DeleteMenu 関数 (winuser.h) - Win32 apps | Microsoft Learn

MF_BYCOMMAND.cppで、

こうしてみる。

Item3がこうなっているとして、
Item3がこうなっているとして、

Item3がこうなっているとして、

Item1-2をクリック
Item1-2をクリック

Item1-2をクリック。

Item3-2が消えてる
Item3-2が消えてる

Item3-2が消えてる。

Sample/winapi/MF_BYCOMMAND/MF_BYCOMMAND/src/MF_BYCOMMAND at master · bg1bgst333/Sample · GitHub

MENUITEMINFO

MENUITEMINFO構造体の内容を変えれば、メニュー項目の様々な設定や取得が出来る。

MENUITEMINFOW (winuser.h) - Win32 apps | Microsoft Learn

MENUITEMINFO.cppで、

選択したメニュー項目がグレーアウトする。

これをクリックしたら
これをクリックしたら

これをクリックしたら、

グレーアウト
グレーアウト

グレーアウト。

Sample/winapi/MENUITEMINFO/MENUITEMINFO/src/MENUITEMINFO at master · bg1bgst333/Sample · GitHub

SetMenuItemInfo

SetMenuItemInfoで、メニューアイテムの情報を設定する。

SetMenuItemInfoW 関数 (winuser.h) - Win32 apps | Microsoft Learn

SetMenuItemInfo.cppで、

選択されたアイテムのメニュー項目名を変更。

ここをクリックすると
ここをクリックすると

ここをクリックすると、

こうなる。
こうなる。

こうなる。

Sample/winapi/SetMenuItemInfo/SetMenuItemInfo/src/SetMenuItemInfo at master · bg1bgst333/Sample · GitHub

GetMenuItemInfo

GetMenuItemInfoで、メニューアイテムの情報を取得する。

GetMenuItemInfoW 関数 (winuser.h) - Win32 apps | Microsoft Learn

GetMenuItemInfo.cppで、

選択されたアイテムの情報を取得し、メッセージボックスでメニュー項目名を表示。

ここなら、
ここなら、

ここなら、

こうなる。
こうなる。

こうなる。

Sample/winapi/GetMenuItemInfo/GetMenuItemInfo/src/GetMenuItemInfo at master · bg1bgst333/Sample · GitHub

DrawMenuBar

DrawMenuBarで、メニューの再描画をする。

DrawMenuBar 関数 (winuser.h) - Win32 apps | Microsoft Learn

DrawMenuBar.cppで、

				// どのメニュー項目が選択されたかを判定する.
				switch (LOWORD(wParam)){	// LOWORD(wParam)で選択されたメニュー項目のIDが取得できるので, その値で判定する.

					// 取得したIDごとに処理を分岐.
					// Item2-1が選択された時.
					case ID_ITEM_2_1:

						// ID_ITEM_2_1ブロック
						{

							// hPopupMenu3の追加.
							hPopupMenu3 = CreatePopupMenu();	// CreatePopupMenuでポップアップメニューを作成し, ハンドルをhPopupMenu3に格納.
							AppendMenu(hMenu, MF_ENABLED | MF_POPUP, (UINT_PTR)hPopupMenu3, _T("Item3(&X)"));	// AppendMenuでhMenuにhPopupMenu3を追加.

						}

						// 既定の処理へ向かう.
						break;	// breakで抜けて, 既定の処理(DefWindowProc)へ向かう.

メニューを追加。

押しても
押しても

押しても、

Item3は追加されない。というか再描画されないから見えない。
Item3は追加されない。というか再描画されないから見えない。

Item3は追加されない。というか再描画されないから見えない。

DrawMenuBarを追加すると、

押すと、
押すと、

押すと、

再描画でItem3が見える。
再描画でItem3が見える。

再描画でItem3が見える。

Sample/winapi/DrawMenuBar/DrawMenuBar/src/DrawMenuBar at master · bg1bgst333/Sample · GitHub

GetMenuItemCount

GetMenuItemCountで、メニュー項目の項目数を取得する。

GetMenuItemCount 関数 (winuser.h) - Win32 apps | Microsoft Learn

GetMenuItemCount.cppで、

メニューのリソースIDはこうする。
WM_CREATEでは、

2つのポップアップメニューを作成。

Item2-1が選ばれたら、GetMenuItemCountでhPopupMenu1のメニュー項目の数を取得。

Item1傘下のポップアップメニューは項目数3つ。
Item1傘下のポップアップメニューは項目数3つ。

Item1傘下のポップアップメニューは項目数3つ。

Item2-1を選択
Item2-1を選択

Item2-1を選択、

iCountは3
iCountは3

iCountは3。

Sample/winapi/GetMenuItemCount/GetMenuItemCount/src/GetMenuItemCount at master · bg1bgst333/Sample · GitHub

DeleteMenu

DeleteMenuで、指定のメニューアイテムを削除する。

DeleteMenu 関数 (winuser.h) - Win32 apps | Microsoft Learn

DeleteMenu.cppで、

ウィンドウ生成時に、3つのアイテムを追加した後、ID_ITEM_1_2だけはすぐ削除。

ウィンドウ破棄時は、残った2つを削除。

起動時、メニューアイテムは2つになっている。
起動時、メニューアイテムは2つになっている。

起動時、メニューアイテムは2つになっている。

Sample/winapi/DeleteMenu/DeleteMenu/src/DeleteMenu at master · bg1bgst333/Sample · GitHub