- ベストアンサー
メニューをグレー表示でなく非表示にするには?
環境は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); }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ウインドウが作成されてから削除するのではなく、リソースエディタで削除してしまった方が楽だと思います。 pCmdUI->Enable(false); は削除するコマンドではなく、灰色にするコマンドです。 CMainFrame::OnCreate() ここでRemoveMenuをすれば該当するメニューが削除されます。削除されるのはメインフレームのメニューです。 MDIなどでは子ウインドウがある場合は子ウインドウ(子フレーム)のメニューが表示されるので削除されていないように見えるのかもしれません。 子ウインドウのメニューをいじるにはいくつか方法があります。簡単な方法としては CChildFrame::OnUpdateFrameMenu() でGetParentFrame()->GetMenu()に対してRemoveMenuをかければ削除できます。
その他の回答 (1)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>CMenu *pMainMenu; >CMenu *pSubMenu; >pMainMenu = GetMenu(); >pSubMenu->RemoveMenu(ID_SELECT_DATA_FOLDER, >MF_BYCOMMAND); 本当にこれで動いてますか? pSubMenuの値が不定にしか見えないんですけど。 あと、GetMenuをCMainFrameのコンストラクタで呼んでもだめです。ウィンドウが生成された後に呼ばないと意味がありません。なんで、メニュー項目を削除するタイミングはOnCreateがいいんではないでしょうか?
補足
アドバイスありがとうございます。 失礼しました。メニュー項目の削除はコンストラクタではなく、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()
お礼
ありがとうございます。 解決方法が見えてきました。 さっそくテストをしてみようと思います。