8

メソッドを使用してメニュー項目を無効化/グレーアウトしようとしていますCMenu::EnableMenuItem()

ダイアログのトップ メニューを参照するCMenu*変数があります。を使用しpMenuてサブメニューを取得し、取得したサブメニュー/メニュー項目の名前を確認できます。方法に困っていますが。メニューがあるとしましょう。その中には、ポップアップ メニューと、、、およびメニュー項目があります。とサブメニュー項目があります。(例) を使用すると、またはを無効にできますが、 、および、および および を含むすべてのメニュー項目に対して機能が失敗します。pMenu->GetSubMenu(int)submenu->GetMenuStringA()EnableMenuItem()FileNewOpenImportCloseClose AllNewOpenNew->Documentsubmenu->EnableMenuItem([position of submenu/menuitem], MF_BYPOSITION | MF_GRAYED);NewOpenImportCloseClose AllNewOpen

注:EnableMenuItem()失敗すると言っても、-1 を返すという意味ではありません。以前の状態に戻りますが、メニューが無効になったりグレー表示になったりすることはありません。

http://msdn.microsoft.com/en-us/library/h62wh3y1.aspxの MSDN ドキュメントでEnableMenuItem()は、これはポップアップ メニュー項目と標準メニュー項目の両方で機能すると主張しています。ただし、ポップアップのものでのみ機能するようです。

4

2 に答える 2

3

ScottMcP-MVP MFC は ON_UPDATE_COMMAND_UI ハンドラーでメニュー構成を行います:アプリケーションのユーザーがメニューをプルダウンすると、各メニュー項目は、有効または無効として表示する必要があるかどうかを知る必要があります。メニュー コマンドのターゲットは、ON_UPDATE_COMMAND_UI ハンドラーを実装することにより、この情報を提供します。アプリケーション内のコマンド ユーザー インターフェイス オブジェクトごとに、[プロパティ] ウィンドウを使用して、各ハンドラーのメッセージ マップ エントリと関数プロトタイプを作成します。

メニューがプルダウンされると、フレームワークは各 ON_UPDATE_COMMAND_UI ハンドラーを検索して呼び出し、各ハンドラーは Enable や Check などの CCmdUI メンバー関数を呼び出し、フレームワークは各メニュー項目を適切に表示します。

つまり、チェック/チェック解除できるメニュー項目の期待される状態を独自のクラスに保存する必要があります。ON_UPDATE_COMMAND_UIメニュー要素ごとに 1 つのマクロをマクロの近くON_COMMANDに配置する必要があります。その要素は、必要に応じて変更できる CCmdUi オブジェクトを受け取る関数を参照します。しかし、MFC を使用しているため、通常は手動で行うのではなく、メニューを含むウィンドウのプロパティを使用するだけです。

于 2015-01-19T15:07:39.243 に答える