Tips9 右ボタンメニュー

前のTips 次のTips


 VC++4.xではコンポーネントギャラリで右ボタンを簡単に実装することができます。 しかし、実際にやってみた人は気がついたかもしれませんが、メニューのオーナがフレームウィンドウで ないとメニューアイテムのアップデート(無効なメニューアイテムはグレイアウトされる等)がちゃんと動作しません。
 では、ダイアログなどのようにフレームウィンドウでないものをオーナにしたい場合はどうしたらよいのでしょう?

■ メニューアイテムのアップデートの仕組み

 コマンドの更新ハンドラにブレークポイントを仕掛け、メニュー操作を行うことで、 更新ハンドラがどこからコールされているかを知ることができます。実際にやってみると、 更新ハンドラを呼んでいるのは CFrameWnd::OnInitMenuPopup だということが解ります。 だから、右ボタンメニューのオーナがフレームウィンドウ (またはその派生クラス)でないと、メニューアイテムが更新されないんですね。 だって、CView はそのようなメソッドを持っていませんから。
 CFrameWnd::OnInitMenuPopup ではメニューの各アイテムを調べ、そのコマンドターゲットに対し OnCmdMsg(m_nID, CN_UPDATE_COMMAND_UI, this, NULL) を実行することで、メニューアイテムの更新ハンドラ を呼び出し、グレイアウト等の処理を行っています。

■ メニューアイテムのアップデート処理

 では、フレームウィンドウ以外をオーナとするとき、右ボタンメニューでの更新処理を行うには どうしたらいいでしょうか?答えは、自分で(あなたが)OnInitMenuPopup 相当のものを実装するってことです。
 具体的には、以下の様にします。


前のTips 次のTips 津田伸秀 のホームページに戻る。

Last Updated on 6-Oct-1996, Copyright (c) 1996 by Nobuhide Tsuda, All Right Reserved.
このホームページに関するご質問、ご要望、バグレポート等は  Nobuhide_Tsuda@jsn.justnet.or.jp  までメールをいただければ幸いです。