メニュー関係が良く解らない。
AppendMenu や InsertMenu 等で動的にメニューの内容を変えられ、且つ、CreateMenu や CreatePopupMenu 等で動的にメニューリソースを確保する事が出来ますがー
さて、CreatePopupMenuで、サブメニューを動的に追加しようとします。 ハンドルを新しく作成してゴニョるわけですが…。
この新しく作ったサブメニューへのハンドルって、挿入先メニューに挿入した後削除するべきなのか否かが解らず…。^^;
case WM_CREATE:
{
HMENU hMenu = ::LoadMenu(hInst, MAKEINTRESOURCE(IDC_MENUTEST));
HMENU hSub = ::GetSubMenu(hMenu, 0);
// サブメニューを作成して追加
HMENU hPopup = ::CreatePopupMenu();
::AppendMenu(hPopup, 0, 169, _T("かしらー"));
::AppendMenu(hSub, MF_POPUP, (UINT_PTR)hPopup, _T("なのだわ"));
// ::DestroyMenu(hPopup); // いりますか?いりませんか?
::SetMenu(hWnd, hMenu);
}
break;
「え、削除しちゃったら挙動おかしくなるんじゃね!?」 とか思ってしまいますが、例えば LoadLibrary なんかは同じDLLをロードしようとした所で、ハンドル内部の参照カウンタがインクリメントされるだけとか言う話(FreeLibrary は逆にデクリメントされる)。
こんな感じで、開放処理っぽいことを適切に行わなかった場合、リソースリークに繋がる……?う?
いやー、そうでもないのかなぁー……。 ウィンドウや他のメニューに関係させてしまったら、その関係先ハンドルに全ての管理権限が渡されるような気がしないでもないんですよねー…
うーん。
Webで検索しても、関連付けた後に破棄してるようなコードは見かけないような気がするし、別にえぇのかなぁー……。 DirectX 関係弄くってると「え、取得したら開放しなきゃアカンちゃうん!?」と、とたんに不安になってくる。
余談ですが、私の環境下では DestroyMenu してもしなくても挙動は特に変わらず、普通にサブメニューが増えました。