Chapter.12

メニュー(1)

2005/1/7
 ・インターフェースが継承可能であることが判明したのでサンプルソースを修正。

1.コンポジットメニュー(composite menu)

第9章から第11章までに、ツールバーを学習してきました。 この章からは、インプレースアクティブ状態のOLEサーバが提供する、もう一つのユーザーインターフェースであるメニューを解説していきます。

通常、アプリケーションで常に表示しておけるメニューは一つです。 そして、それは、トップレベルウィンドウ(親を持たないウィンドウ)だけで表示可能です。 そのため、アプリケーションとOLEサーバそれぞれが、独自のメニューを表示しようとすると、競合が発生することになってしまいます。 この競合を回避するために、OLEが提供する方法とは、アプリケーションとOLEサーバのメニューを足し合わせて一つのメニューにすることです。 この足し合わされたメニューのことをコンポジットメニュー(composite menu)と呼んでいます。

最初からコンポジットメニューの全てを扱うよりは、段階を踏んで解説していきたいと思います。 この章では、手始めにOLEサーバが提供するメニューを表示することにします。 下の図は、OLEサーバのメニューを表示出来るようにしたものです。

図を見ると分かることですが、OLEサーバを操作するのに使用していたアプリケーション独自のメニューが消えています。


2.IOleInPlaceFrame.SetMenu

OLEサーバのメニューを扱えるように修正したサンプルソースです。
VB.NETサンプルソース:chap12.vb.lzh(35KB未満 2005/1/7)

OLEサーバのメニューを表示するためには、IOleInPlaceFrame.SetMenuを実装するだけで済みます。 このメソッドは、前章で解説したinput_sync属性を持つメソッドに該当しています。 独自に実装する場合、注意してください。

通常のメニューが表示されなくなると、インプレースアクティブ状態を解除する方法が無くなってしまう問題が出てきます。 これには、インプレースアクティブ化時にフォームがクリックされると、インプレースアクティブ状態を解除する処理を追加することで対応しました。


3.まとめ

ツールバーの解説を行った時点で、インプレースハンドラ等の修正を行っているので、この章での修正点はかなり少なかったと思います。 .NET Frameworkのメニューは、Win32のラッパーであるため、.NET Frameworkから大きく逸脱した処理を行わずに済んだと言うことが出来ます。

どうでもいい話なのですが、このIOleInPlaceFrameが扱うメニューのことを日本語に適切に翻訳した文書はほとんど存在しませんでした。 MSDNライブラリの中では、コンポジットメニューマージされたメニューという風に2通りの呼び方をされているようです。 私は、最初、マージされたメニューと書いていたのですが、複合ファイル(composite file)をヒントに複合メニューと書き換えて、結局、コンポジットモニカ(composite moniker)からコンポジットメニューという名称に落ち着きました。 これもマイクロソフトの日本語訳に統一性が無いのが悪いのです。まあ、文句を言っても仕方ないのですが・・・。


前へ 次へ
OLE on .NET Frameworkへ
総合トップへ