Chapter.7

インプレースアクティベーション

2004/6/30
 ・第2節を修正。インプレースアクティベーションに使用されるインターフェースの解説を詳細に。
2005/1/6
 ・サンプルにMakefileを追加。

1.インプレースアクティベーション

インプレースアクティベーションとは、外部のアプリケーションで編集することに対して、アプリケーションの内部で編集することを言います。 そのため、インプレース編集とも呼ばれています。前回に続いて、先にサンプルを見てもらうことにします。
VB.NETサンプルソース:chap7.vb.lzh(38KB未満 2005/1/6)

サンプルのIOleObject操作メニューには、インプレースアクティベーションを使用するための新メニューをDoVerbの編集メニューの下に追加しています。 なお、今回の画像は諸々の事情により、ビットマップイメージを扱うOLEサーバ(以下、ペイントブラシと呼ぶ)を使用しています。 OLEIVERB_xxxという名前のメニューが数個追加されていることが分かると思います。(下図)


ところが作った後に、ペイントブラシは、この追加したOLEIVERB_xxxを処理できないことが判明しました。 仕方ないので、そのまま編集メニューを選択てみてください。 そうすると下図に示すように、VB.NETのフォーム上で見事にインプレースアクティブ化できます。


当然、これはインプレースで編集可能な状態を意味するので、そのまま編集することが可能です。 上の絵にサインを書いてみたのが下の画像です。



2.インプレースアクティベーションを担うインターフェース

インプレースアクティベーションを処理するの重要となるインターフェースは、4つあります。 その4つとは、IOleInPlaceObjectIOleInPlaceActiveObjectIOleInPlaceSite、及び IOleInPlaceFrameです。 これら4つのインターフェースはすべて、IOleWindowというインターフェースを派生して定義されています。

IOleWindowは、インターフェースに関連付けられたウィンドウに、アクセスするために使用されます。 このインターフェースを実装するオブジェクトは、全てウィンドウに関連付けられていなければなりません。(ただし、後の方で出てくるウィンドウレスActiveXコントロールは例外です。これは、その名の通りウィンドウを持たないコントロールなのでウィンドウに関連付いてる必要はありません。)

IOleInPlaceObjectは、OLEサーバのインプレースアクティブ状態を管理するのに使用されます。インプレースアクティベーション可能なすべてのOLEサーバは、このインターフェースを実装する必要があります。 また、インプレースアクティブ化されたオブジェクトの位置も扱います。

IOleInPlaceActiveObjectは、アプリケーションレベルで制御しなければならない機能(ショートカットキーや、モーダルダイアログの表示等)を扱うために使用されます。このインターフェースも、インプレースアクティベーション可能なOLEサーバが実装する必要のあるインターフェースの1つです。

IOleInPlaceSiteは、インプレースアクティブ化するために、クライアントが実装しなければならないインターフェースのうちの1つです。 このインターフェースは、IOleClientSiteを拡張し、クライアントにOLEサーバのインプレースアクティブ化を受け入れる機能を提供します。 実際のところ、このインターフェースの実装で最も重要なメソッドは、GetWindowContextで、これ以外のメソッドは適当に実装してもインプレースアクティブ化出来てしまうこともあります。

IOleInPlaceFrameは、インプレースアクティブ化したOLEサーバが、ユーザーインターフェースを制御するためにクライアントのメインウィンドウと直接対話するためのインターフェースです。 IOleInPlaceSiteと異なるところは、このインターフェースが実装されていなくても、インプレースアクティブ化できるOLEサーバが存在してもおかしくないところです。 実際には、そういったOLEサーバにお目にかかったことはありませんが・・・。このインターフェースは適当に実装しても、たいていインプレースアクティブ化を阻害しません。


3.まとめ

今回のクライアントの実装は、インプレースアクティベーションを行うために必要最小限の機能のみ実装しています。 現時点では、インプレースアクティブ化できないOLEサーバも多数存在しています。 OLEサーバのユーザーインターフェースに関する要求を処理する機能の実装は、次章からにしたいと思います。

↑と思っていたのですが、次章ではサンプル作成の上ではまった場所を解説します。


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