none
メニューバーのメニューを無効化してもグレーアウトされない?

    質問

  • いつもお世話になっております。arubi-momoと申します。

    先日の質問とは別件なのですが、またメニュー関連の質問です。

    開発環境は、Windows7 64bit  VisualStudio2010  MFC を使用しております。

    シングルドキュメントのプロジェクトで、メイン画面を開いた状態で、子ダイアログ画面をモーダルで開いて使うようなイメージです。

    現在発生している状況なのですが、ダイアログ画面のメニューバーのメニューを、ある条件の時に、ON_UPDATE_COMMAND_UIのメッセージ処理で無効にしています。

    void CApp::OnUpdateTest(CCmdUI*pCmdUI)
    {
        if(表示条件){
          pCmdUI->Enable(FALSE);
        else{
          pCmdUI->Enable(TRUE);
        }
    }
    

    このような感じです。

    これで、実際メニューは無効にはなっており、選択しても何も起こらないのですが、表示としてグレーアウトされないケースがあります。

    すべての無効メニューがグレーアウトされないのであれば、ビジュアルスタイルなどの設定の問題かと思うのですが、グレーアウトされるメニューとされないメニューがあり、プロパティなどの設定も確認したのですが、両者の間に差異はなく、全く原因がわからず困っております。

    無効にはなっているため、表示条件も正しく機能しているようです。

    グレーアウトされる、されないの違いに心当たりのある方がいらっしゃいましたら、ご教示いただければ幸いです。

    何卒、よろしくお願いいたします。

    2017年3月28日 1:54

回答

  • CFrameWnd の派生クラス以外でメニューを張り付けている場合、標準では、OnUpdateXxxx のような CCmdTarget気候を利用したメニューのアップデート処理が行われません。

    ダイアログクラスは、CFrameWnd の派生クラスではないので、この部分が搭載されていないため、自分で同じように処理する必要があります。

    また、コンテキストメニューのように TrackPopupMenu を使う場合は、4つ目のパラメータに CFrameWnd の派生クラスを渡してあげないと同様の処理は行われません。


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2017年3月29日 2:23

すべての返信

  • CFrameWnd の派生クラス以外でメニューを張り付けている場合、標準では、OnUpdateXxxx のような CCmdTarget気候を利用したメニューのアップデート処理が行われません。

    ダイアログクラスは、CFrameWnd の派生クラスではないので、この部分が搭載されていないため、自分で同じように処理する必要があります。

    また、コンテキストメニューのように TrackPopupMenu を使う場合は、4つ目のパラメータに CFrameWnd の派生クラスを渡してあげないと同様の処理は行われません。


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2017年3月29日 2:23
  • とっちゃんさま

    いつもお世話になっております。返信が遅れまして申し訳ありません。

    ご回答ありがとうございました。

    ダイアログクラスではメニューのアップデート処理が搭載されていないのですか。

    別のダイアログ画面ではアップデート処理が効いていたため、同じ処理をしているのにどうして?と思っていました。そちらのダイアログでは個別処理がされていたのかもしれません。クラス構成など確認しながら調べてみることにします。

    また、ご教示いただきましてありがとうございました。Update処理を使わず、メニューの制御処理を追加して、機能を実現することができました。

    メニューを制御したいタイミングで、this->GetMenuでメニューを取得し、それに対してEnableMenuItemで無効化して、DrawMenuBarでメニューバーを更新することにより実現できました。

    今後ともどうぞよろしくお願いいたします。

    2017年4月3日 4:32