ユーザーが [ファイル] メニューでマウスをクリックすると、WM_INITMENUPOPUP メッセージが生成されます。 フレームワークの更新メカニズムは、ユーザーが表示できるようにメニューがドロップダウンする前に、[ファイル] メニューのすべての項目をまとめて更新します。
これを行うために、フレームワークは、標準のコマンド ルーティングに沿って、ポップアップ メニューのすべてのメニュー項目の更新コマンドをルーティングします。 ルーティングのコマンド ターゲットには、更新コマンドを適切なメッセージ マップ エントリ (フォーム ON_UPDATE_COMMAND_UI
の) と照合し、"更新ハンドラー" 関数を呼び出すことによって、メニュー項目を更新する機会があります。 したがって、6 つのメニュー項目を含むメニューの場合、6 つの更新コマンドが送信されます。メニュー項目のコマンド ID に対して更新ハンドラーが存在する場合は、更新を実行するために呼び出されます。 そうでない場合、フレームワークはそのコマンド ID のハンドラーの存在を確認し、必要に応じてメニュー項目を有効または無効にします。
フレームワークがコマンド ルーティング中に ON_UPDATE_COMMAND_UI
エントリを見つけられない場合、同じコマンド ID を持つ ON_COMMAND
エントリがある場合、ユーザー インターフェイス オブジェクトが自動的に有効になります。 それ以外の場合は、ユーザー インターフェイス オブジェクトが無効になります。 そのため、ユーザー インターフェイス オブジェクトが有効になっていることを確認するには、オブジェクトが生成するコマンドのハンドラーを指定するか、更新ハンドラーを指定します。 「オブジェクトとコマンド ID のUser-Interface」トピックの図を参照してください。
ユーザー インターフェイス オブジェクトの既定の無効化を無効にすることができます。 詳細については、MFC リファレンスのクラス CFrameWnd
のm_bAutoMenuEnable メンバーを参照してください。
メニューの初期化はフレームワークで自動的に行われ、アプリケーションがWM_INITMENUPOPUP メッセージを受信したときに発生します。 アイドル ループ中、フレームワークはメニューの場合とほぼ同じ方法で、ボタン更新ハンドラーのコマンド ルーティングを検索します。