• ベストアンサー

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

環境は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

  • ダイアログボックスの最大化・最小化ボタンを無効表示

    VC++ .NET2003 + MFCでプログラムを作成しています。 ダイアログボックスに最大化・最小化ボタン(タイトルバーの右端)を無効状態で表示する方法が分かりません。どなたか、ご教示ください。 ちなみに、ウィンドウスタイルから WS_MAXIMIZEBOX、WS_MINIMIZEBOXを削除するとそれぞれのボタンが表示されなくなりますが、これでは要件を満たしません。 あくまでも、無効状態のボタンを表示させたいのです。 ×ボタンと同じ方法で出来るのかと思い、OnInitDialog()の中で GetSystemMenu(FALSE)->EnableMenuItem(SC_MINIMIZE, MF_BYCOMMAND | MF_GRAYED); GetSystemMenu(FALSE)->EnableMenuItem(SC_MAXIMIZE, MF_BYCOMMAND | MF_GRAYED); としてみましたが、駄目でした。 # この方法ではシステムメニュー内の項目も無効表示にはなりませんでした。 続いて、WM_INITMENUのハンドラで以下のようにしてみたところ、システムメニューの項目は無効表示になりましたが、タイトルバー右端の最大化・最小化ボタンは有効状態のまま変わりませんでした。 void OnInitMenu(CMenu* pMenu) { pMenu->EnableMenuItem(SC_MINIMIZE, MF_BYCOMMAND | MF_GRAYED); pMenu->EnableMenuItem(SC_MAXIMIZE, MF_BYCOMMAND | MF_GRAYED); } ちなみに、WM_SYSCOMMANDハンドラ(OnSysCommand)で最大化・最小化のコマンドを無視する事で動作そのものを無視する事は出来ています。 後はボタンを無効表示にするだけなのですが... どうか、よろしくお願いします。

  • VC++でコンボボックスに動的に値を表示させたいです。助けてください(^^;)

    コンボボックスをリソースヴューで作った後、それをダブルクリックしたら void CCommentDialog::OnEditchangeCombo1() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください } とでましたので void CCommentDialog::OnEditchangeCombo1() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください m_combo1.ResetContent(); for(i=0;i<2;i++) m_combo1.InsertString(-1,test_name[i]); } とした後、実行しましたがまったくtest_nameがコンボボックスに表示されませんでした。 しかたなく動的は諦めて、m_combo1.InsertString(-1,"abc"); と変更して実行してもなにもコンボボックスに表示されません。 開いても空なのです。 どうすれば良いでしょうか?

  • タスクバーのメニュー表示

    Visual C++ 6.0 MFCにて質問があります。 [環境] Visual C++ 6.0 MFC [タスクバーのアイコンの処理] リソースにMenuを作成して、以下のソースを作成いたしました。しかし、タスクバーのアイコンをクリックして、Menuが表示されるはずなのですが、途中でエラーが出てしまいます。CMenu* pMenu;がうまく処理されていないみたいなのですが、ソース的に問題ないように思うのですが.... 何か問題があるのでしょうか?? [ソース] CMenu MyMenu; CMenu* pMenu; POINT pt; // 現在のカーソル位置を取得 ::GetCursorPos(&pt); // フォーカスを当てる SetFocus(); // メニューのロード VERIFY(MyMenu.LoadMenu(IDR_MENU1)); // 0番目のメニューを取得 pMenu = MyMenu.GetSubMenu(0); ASSERT(pMenu != NULL); <-- ここでエラーがでる。 // メニューの表示 if(pMenu->TrackPopupMenu( TPM_LEFTALIGN| TPM_RIGHTBUTTON, pt.x, pt.y , this) == 0){ return FALSE; } // メッセージを送る PostMessage(WM_NULL); return TRUE;

  • Formを動かせるようにしたい

    お世話になります。 OS XP PRO  VB6(SP5)で開発しています。 ディスプレイのサイズによりFormを動かせたり固定させたりしたいのですが、 規定値は固定にしたいのでFormプロパティのMoveableはFalseにしてあります。 下記のようにプログラミングしたのですが固定されたままです。 Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long Private Declare Function GetSystemMenu Lib "user32" (ByVal _ hwnd As Long _ , ByVal bRevert As Long) As Long Private Declare Function RemoveMenu Lib "user32" ( _ ByVal hMenu As Long, ByVal nPosition As Long, _ ByVal wFlags As Long) As Long Private Declare Function DrawMenuBar Lib "user32" ( _ ByVal hwnd As Long) As Long Private Const MF_BYCOMMAND = &H0 Private Const SC_MOVE = &HF010 Private Sub Form_Load() Dim kk As Long kk = GetSystemMenu(.hwnd, bb) Call RemoveMenu(kk, SC_MOVE, MF_BYCOMMAND) Call DrawMenuBar(.hwnd) End Sub アドバイス頂きたくよろしくお願いします。 以上です。

  • CMainFrameクラスの使い方

    すみませんが教えてください。 これまで左クリックで画面に文字を表示するときには、何も考えずCxxxViewクラスにWM_LBUTTONDOWNをかいていました。ところがCMainFrameクラスにもちゃんとWN_LBUTTONDOWNが用意されているではないですか。 先ほど教えていただいたばかりの左クリックにてウインドウサイズ変更ができると思い以下のようにしましたが、何も起きませんでした。 どうすれば実現できるのでしょうか? CMainFrameクラスのWN_LBUTTONDOWNはどのような時に使うのですか? void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください AfxGetMainWnd()->SetWindowPos(NULL,100,200,300,400,SWP_SHOWWINDOW); CFrameWnd::OnLButtonDown(nFlags, point); }

  • MFC ポップアップメニューのチェック表示について

    はじめまして。 質問させてください。 VC 2005 MFC を使用して開発しております。 ダイアログベースです。 ポップアップメニューのアイテムをクリックされたら チェックマークをON OFFしたいのですが、現状うまくいきません。 [現在の方法] //右クリックで表示 void CAnalogClockDlg::OnRButtonDown(UINT nFlags, CPoint point) { CMenu menu; VERIFY(menu.LoadMenu(IDR_MENU)); CMenu* pPopup = menu.GetSubMenu(0); ASSERT(pPopup != NULL); ClientToScreen(&point); pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, AfxGetMainWnd()); CDialog::OnRButtonDown(nFlags, point); } //項目の有効無効時 void CAnalogClockDlg::OnUpdatePopupFore(CCmdUI *pCmdUI) { pCmdUI->SetCheck(false); pCmdUI->SetText(_T("test")); } リソースメニューで [checked] = trueにして 初回表示はチェックありになっているのですが、 pCmdUI->SetCheck(false); の処理で変更されません。 ちなみにキャプションを変更できません。 何か根本的に間違っているのでしょうか? 詳しい方がおりましたら ご教授お願いいたします。

  • C# 右クリックメニューにチェックを入れたい

    VS2008 のC#でのプログラミングです。 右クリックメニューに、 AAA,BBB,CCC,DDD,EEE,ABC,CDE,EFG という選択肢があり、 AAA,BBB,CCC,DDD,EEE,の中の1つだけが選べ、 AAAを選んだときだけ、 さらに、ABC,CDE,EFGの1つが選択できる状態を作りたいと思っています。 つまり、 AAAを選んだとき、AAAにチェックを入れ、BBB,CCC,DDD,EEEのチェックを外し、 ABC,CDE,EFGを選択可能にする。 BBB,CCC,DDD,EEEを選んだとき、選んだ以外のAAA,・・EEEのチェックを外し、 ABC,CDE,EFGを選択不可のグレーアウト表示にする。 を実現したいです。 contextMenuStripを選択して右クリックメニューを作り、選択肢をつくるところまではできました。 もちろん、各処理先で、 AAAToolStripMenuItem.Checked = true; BBBToolStripMenuItem.Checked = false; CCCToolStripMenuItem.Checked = false; DDDToolStripMenuItem.Checked = false; EEEToolStripMenuItem.Checked = false; や AAAToolStripMenuItem.Checked = false; BBBToolStripMenuItem.Checked = true; CCCToolStripMenuItem.Checked = false; DDDToolStripMenuItem.Checked = false; EEEToolStripMenuItem.Checked = false; のように、それぞれ他のチェックを外し、自分をチェックするコードを書けばよいのはわかりますが、 「他のチェックを外す」をforループでまとめて書きたいのですが書き方がわかりません。またグレーアウトする方法も合わせて教えて下さい。 昔、Cで作成したときは、  EnableMenuItem(hMenu, i, MF_ENABLED/MF_GRAYED); で選択可能・グレーアウト  CheckMenuItem(hMenu, i, MF_CHECKED/MF_UNCHECKED); でチェックのオンオフができましたが、VS2008のC#でのやり方がわかりません。 よろしくお願いします。

  • VBA2003: 自作メニューバーを操作したい

    Application.CommandBars("Worksheet Menu Bar").Controls.Add このメソッドを使って Excelのメニューバーに自作メニューを追加しました。 メニューは階層構造になっています。 Excelのシート名によって、このメニューに定義したサブメニューやコマンドを Enabled = True/False で表示制御したいのですが、その方法がわかりません。 よろしくお願いします。

  • VisualStudio2010のデバッグメニュー

    Visual Studio 2010 Express でC++を使い始めたのですが、2008版と違ってデバッグメニューの中に「デバッグなしで開始」というコマンドがありません。コンソール画面に何かを表示させるプログラムを走らせても、画面は一瞬にして消えてしまい、表示を確認することもできません。 return の前に system("pause"); を入れてみましたが、定義されてない識別子ということでだめでした。 何かコンソール画面を静止させる方法があるのでしょうか?

  • visual C++ 2005 でのイベントの作成

    visual C++ 2005 でのイベントの作成で困っています。 ダイアログ ベースのプログラミング http://oshiete1.goo.ne.jp/oshiete_new.php3 上記のサイトをはじめから実行していったのですが、「イベントハンドラ の追加」の部分で void CButtonDlg::OnBnClickedButton1() { // TODO: この位置にコントロール通知ハンドラ ... } の// TODO: この位置にコントロール通知ハンドラ ...の部分にサイトの 記述に有るような AfxMessageBox("第 1 のボタンを押しました。"); という記述をしたのですがこれをビルドするとエラーになります。 エラーメッセージは c:\documents and settings\asakawa\my documents\visual studio 2005\projects\ren\ren\rendlg.cpp(160) : error C2665: 'AfxMessageBox' : 2 オーバーロードのどれも、すべての引数の型を変換できませんでした c:\program files\microsoft visual studio 8\vc\atlmfc \include\afxwin.h(5025): 'int AfxMessageBox(LPCTSTR,UINT,UINT)' の 可能性があります。 c:\program files\microsoft visual studio 8\vc\atlmfc \include\afxwin.h(5027): または 'int AfxMessageBox(UINT,UINT,UINT)' 引数リスト '(const char [17])' を一致させようとしているとき と出ます。 何が原因でしょうか? ヒントでも良いんですが…

PX-5Vの不具合について
このQ&Aのポイント
  • フォトBlackインクに切り替えてプリントすると画像の上にインクのシミが出ます。
  • マットBlackインクを使用しているときにはこの不具合は起きません。
  • ノズルチェックとヘッドクリーニングをしても改善されません。
回答を見る