GetMenu

GetMenuで、指定のウィンドウのメニューハンドルを取得する。

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

GetMenu.cppで、

メニューリソースIDは、再びウィンドウクラスのwc.lpszMenuNameで指定するように戻した。

GetMenuでhwndのメニューハンドルhMenuを取得し、それをDestroyMenuする。
といっても、ウィンドウクラス指定の場合は、破棄する必要があるのだろうか。また、破棄していいのだろうか。

メニューは表示できるとして。
メニューは表示できるとして。

メニューは表示できるとして。

一応DestroyMenuは成功するね。
一応DestroyMenuは成功するね。

一応DestroyMenuは成功するね。

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

LoadMenu

LoadMenuで、メニューリソースをロードする。

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

LoadMenu.cppで、

ここでロード。

LoadMenuの場合は、DestroyMenuもいるのかな。

表示できた。
表示できた。

表示できた。

破棄も成功するからこのタイミングでいいのかな。
破棄も成功するからこのタイミングでいいのかな。

破棄も成功するからこのタイミングでいいのかな。

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

GetSubMenu

GetSubMenuで、指定位置のサブメニューハンドルを取得する。

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

GetSubMenu.cppで、

こうしてみる。
スタティック変数のhPopupMenu1などを使わずに、GetSubMenuでサブメニューハンドルを取得し、hPopup1などに入れる。
これでも、

こうして、
こうして、

こうして、

こうなる。
こうなる。

こうなる。

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

RemoveMenu

RemoveMenuは、指定のメニューアイテムを削除するのだが、そこがサブメニューの場合でもハンドルは破棄しない。

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

RemoveMenu.cppで、

こうすると、

Item1-1選択で
Item1-1選択で

Item1-1選択で、

DestroyMenu成功ということは、その前のRemoveMenuでサブメニューハンドルが破棄されなかったということ。
DestroyMenu成功ということは、その前のRemoveMenuでサブメニューハンドルが破棄されなかったということ。

DestroyMenu成功ということは、その前のRemoveMenuでサブメニューハンドルが破棄されなかったということ。

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

DestroyMenu

DestroyMenuで、指定のメニューハンドルを破棄する。

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

DeleteMenuで指定されたメニュー項目がサブメニューを持っている場合、サブメニューのハンドルを破棄する。
サブメニューハンドルが破棄されているかチェックする。
DestroyMenu.cppで、

こうしてみる。
DestroyMenuがFALSEなら、既にDeleteMenuで破棄されているということ。

Item1-1を選択
Item1-1を選択

Item1-1を選択。

FALSEということは、既に破棄されてる。
FALSEということは、既に破棄されてる。

FALSEということは、既に破棄されてる。

そしてItem1は消えてる。
そしてItem1は消えてる。

そしてItem1は消えてる。

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

MF_BYPOSITION

位置を指定する場合は、MF_BYPOSITIONを使う。

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

MF_BYPOSITION.cppで、

こうしてみる。

この状態から
この状態から

この状態から、

Item1-1を選択
Item1-1を選択

Item1-1を選択、

0番目のItem3-1が消える。
0番目のItem3-1が消える。

0番目のItem3-1が消える。

もう一度Item1-1を選択
もう一度Item1-1を選択

もう一度Item1-1を選択、

0番目のItem3-2が消える。
0番目のItem3-2が消える。

0番目のItem3-2が消える。

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