MFCでMDI形式のアプリケーションを作成したとき、デバッグメニューなどのメニュー項目がメニューバーから消せなくて困っていました。リソースは変更せずに動的に削除したい場合どうすればよいのでしょうか?
感覚的にはCMainFrameのOnCreateで消せばいい気がするのですが、これでは消えませんでした。
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
auto pMenu = GetMenu();
pMenu->RemoveMenu(ID_MENU_XXX, MF_BYCOMMAND);
DrawMenuBar();
return 0;
}
解決策
結局子フレームのあるMDIアプリケーションの場合、CChildFrameで消すのが正解のようです。以下のようなコードでメニュー項目が非表示になりました。
void CChildFrame::OnUpdateFrameMenu(BOOL bActive, CWnd* pActiveWnd, HMENU hMenuAlt)
{
CMDIChildWnd::OnUpdateFrameMenu(bActive, pActiveWnd, hMenuAlt);
auto pMenu = GetParentFrame()->GetMenu();
pMenu->RemoveMenu(ID_MENU_XXX, MF_BYCOMMAND);
GetParentFrame()->DrawMenuBar();
}
参考
メニューをグレー表示でなく非表示にするには? - OKWAVE
環境はVisual C++ .netでリソースで作ったメニューをCMainFrameクラスで表示しないようにしようとした...