dポイントプレゼントキャンペーン実施中!

環境は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);
}

A 回答 (2件)

ウインドウが作成されてから削除するのではなく、リソースエディタで削除してしまった方が楽だと思います。




pCmdUI->Enable(false);
は削除するコマンドではなく、灰色にするコマンドです。

CMainFrame::OnCreate()
ここでRemoveMenuをすれば該当するメニューが削除されます。削除されるのはメインフレームのメニューです。
MDIなどでは子ウインドウがある場合は子ウインドウ(子フレーム)のメニューが表示されるので削除されていないように見えるのかもしれません。

子ウインドウのメニューをいじるにはいくつか方法があります。簡単な方法としては
CChildFrame::OnUpdateFrameMenu()
でGetParentFrame()->GetMenu()に対してRemoveMenuをかければ削除できます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/02/18 00:50

>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()

補足日時:2005/02/17 14:25
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A