4

私のメイン フレームには、現在のドキュメント タイプのメニューを含む CMFCMenuBar メンバーがあります。サブメニューを動的に追加/削除したいと思います。たとえば、ユーザーがマップ ペインを表示することを選択した場合、「ファイル」メニューの横にマップ サブメニューを追加したいと考えています。

逆に、マップ ペインが閉じられた場合は、マップ メニュー項目も削除したいと考えています。

機能するが、私が気に入らないことの 1 つは、ON_UPDATE_COMMAND_UIハンドラーのメニュー項目を単に無効にすることです。
Frame にはメソッドが呼び出されていますが、そのメソッドは aGetMenuBar()を返すconst CMFCMenuBar *ため、外部から変更することはできません。ゲッターを追加したので、メニューバーへの非 const 参照を取得しましたが、それも機能しませんでした:

CMenu menu;
VERIFY(menu.LoadMenu(IDR_MAP));
CMFCMenuBar & menuBar = pFrm->GetNonConstMenuBar(); // Custom getter
menuBar.InsertButton(CMFCToolBarMenuButton(0, menu, -1));
menuBar.AdjustLayout();
menuBar.AdjustSizeImmediate();

上記のコードはvoid CMyMenuBar::AddSubMenu ()DynamicMenuサンプルの を改変したものです。ただし、その特定のコードが実行されるかどうか、またはいつ実行されるかを確認できなかったため、このサンプルは壊れていると感じています。サンプルでは、​​メニュー バーがリセットされているとき、または状態がまだレジストリに保存されていないときにのみ、コードが実行されます。

これは不可能ですか、それとも何か間違っていますか?

サブメニューの追加/削除に代わる良い方法はありますか?

4

1 に答える 1

4

これを行う 1 つの方法は、メッセージを処理することWM_INITMENUPOPUPです。メニューが表示される直前に、メニューOnInitMenuPopupへのポインターで呼び出されます。

これは、メニューがポップアップしようとするたびに呼び出され、行った変更は呼び出し間で失われることに注意してください (呼び出されるたびにメニュー項目を追加する必要がありますOnInitMenuPopup)。

これを使用する秘訣は、呼び出されたメニューを識別する方法を理解することです。1 つの方法は、既知のアイテムのメニュー アイテム ID を比較することです。たとえば、メニューの最初の項目が ID_FILE_OPEN の場合、それを探すことができます。見つかった場合は、「ファイル」メニューが開かれていると想定し、カスタム サブメニューを追加できます。

dwMenuData構造体のメンバーを使用することもできますが、メニューMENUINFOの作成方法が原因でこれに問題があったことを思い出したようです。CMFCMenuBar

于 2010-10-11T22:32:14.323 に答える