• ベストアンサー

メニューをグレー表示でなく非表示にするには?

環境はVisual C++ .netでリソースで作ったメニューをCMainFrameクラスで表示しないようにしようとしたのですが、なぜか選択できないグレー表示になってしまいます。気持ち悪いので、どなたかご存知の方教えていただけると嬉しいのですが。 CMainFrame::CMainFrame() { CMenu *pMainMenu; CMenu *pSubMenu; pMainMenu = GetMenu(); pSubMenu->RemoveMenu(ID_SELECT_DATA_FOLDER, MF_BYCOMMAND); DrawMenuBar(); } void CMainFrame::OnUpdateSelectDataFolder(CCmdUI *pCmdUI) { // TODO : ここにコマンド更新 UI ハンドラ コードを追加します。 pCmdUI->Enable(false); }

質問者が選んだベストアンサー

  • ベストアンサー
  • nitscape
  • ベストアンサー率30% (275/909)
回答No.2

ウインドウが作成されてから削除するのではなく、リソースエディタで削除してしまった方が楽だと思います。 pCmdUI->Enable(false); は削除するコマンドではなく、灰色にするコマンドです。 CMainFrame::OnCreate() ここでRemoveMenuをすれば該当するメニューが削除されます。削除されるのはメインフレームのメニューです。 MDIなどでは子ウインドウがある場合は子ウインドウ(子フレーム)のメニューが表示されるので削除されていないように見えるのかもしれません。 子ウインドウのメニューをいじるにはいくつか方法があります。簡単な方法としては CChildFrame::OnUpdateFrameMenu() でGetParentFrame()->GetMenu()に対してRemoveMenuをかければ削除できます。

qmailer
質問者

お礼

ありがとうございます。 解決方法が見えてきました。 さっそくテストをしてみようと思います。

その他の回答 (1)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>CMenu *pMainMenu; >CMenu *pSubMenu; >pMainMenu = GetMenu(); >pSubMenu->RemoveMenu(ID_SELECT_DATA_FOLDER, >MF_BYCOMMAND); 本当にこれで動いてますか? pSubMenuの値が不定にしか見えないんですけど。 あと、GetMenuをCMainFrameのコンストラクタで呼んでもだめです。ウィンドウが生成された後に呼ばないと意味がありません。なんで、メニュー項目を削除するタイミングはOnCreateがいいんではないでしょうか?

qmailer
質問者

補足

アドバイスありがとうございます。 失礼しました。メニュー項目の削除はコンストラクタではなく、OnCreate内で定義しておりました。メニューは(選択不可の)グレー表示になっておりますが、実際に動いております。 念のために関連する個所をすべて引用しました。どうぞよろしくお願いします。 [MainFrm.cpp] int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { CMenu *pMainMenu; CMenu *pSubMenu; pMainMenu = GetMenu(); pSubMenu = pMainMenu->GetSubMenu(1); pSubMenu->RemoveMenu(ID_SELECT_DATA_FOLDER, MF_BYCOMMAND); DrawMenuBar(); } BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) //省略 ON_UPDATE_COMMAND_UI(ID_SELECT_DATA_FOLDER, OnUpdateSelectDataFolder) //}}AFX_MSG_MAP END_MESSAGE_MAP() [MainFrm.h] protected: //{{AFX_MSG(CMainFrame) afx_msg void OnUpdateSelectDataFolder(CCmdUI *pCmdUI); //}}AFX_MSG // DECLARE_MESSAGE_MAP()

関連するQ&A