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