更新ハンドラが呼び出されるタイミング

更新 : 2007 年 11 月

たとえば、ユーザーが [ファイル] メニューをマウスでクリックしたと仮定します。この場合は、WM_INITMENUPOPUP メッセージが生成されます。フレームワークの更新機構は、[ファイル] メニューの全項目をまとめて更新してから、メニューをドロップダウンしてユーザーに表示します。

この動作を実現するために、フレームワークは、標準コマンド ルーティングに従って、ポップアップ メニューの全項目の更新コマンドを送ります。ルーティング上のコマンド ターゲットは、任意のメニュー項目を更新できます。更新するには、更新コマンドと適切なメッセージ マップ エントリ (ON_UPDATE_COMMAND_UI の形式) との一致を確認してから、"更新ハンドラ" 関数を呼び出します。つまり、6 つのメニュー項目があるメニューの場合は、6 つの更新コマンドが送信されます。メニュー項目のコマンド ID に対応する更新ハンドラがある場合は、ハンドラは更新を実行するために呼び出されます。更新ハンドラがない場合は、フレームワークによって、コマンド ID に対応するハンドラがあるかどうかがチェックされ、それに応じてメニュー項目が有効または無効になります。

コマンド ルーティング時に ON_UPDATE_COMMAND_UI エントリが見つからなかった場合は、同じコマンド ID を持つ ON_COMMAND エントリがほかにあれば、ユーザー インターフェイス オブジェクトが自動的に有効になります。それ以外の場合は、ユーザー インターフェイス オブジェクトは無効になります。ユーザー インターフェイス オブジェクトを必ず有効にするには、オブジェクトが生成するコマンドのハンドラまたは更新ハンドラを指定してください。詳細については、「ユーザー インターフェイス オブジェクトとコマンド ID」の図を参照してください。

ユーザー インターフェイス オブジェクトを既定で選択不可にする設定を無効にすることもできます。詳細については、『MFC リファレンス』の「CFrameWnd クラス」の m_bAutoMenuEnable のメンバを参照してください。

メニューの初期化は、アプリケーションが WM_INITMENUPOPUP メッセージを受け取ったときに、フレームワークで自動的に行われます。アイドリング ループ時に、メニューの場合と同じようにコマンド ルーティング内を検索してボタンの更新ハンドラを探します。

参照

概念

ユーザー インターフェイス オブジェクトの更新方法