Chapter.9
ツールバー(1)
2004/7/2
・Excelがインプレースアクティブ化できない理由を修正。
2005/1/6
・インターフェースが継承可能であることが判明したのでサンプルソースを修正。
1.ツールバー
インプレースアクティブ状態になったOLEサーバには、ファイルを編集するために、独自のユーザーインターフェースを表示することが推奨されています。
そのユーザーインターフェースとは、ツールバーとメニューです。この章からは、ツールバーの方を扱っていきます。
ツールバーだけでも、ある程度のボリュームになることが想定されるので、何回かに分割して解説していくことにします。
ツールバーと呼んでいますが、実際のOLE仕様によれば、これはborder spaceという名前です。
そのためツールバーに限らず、インプレースウィンドウ以外にOLEサーバが作成可能なウィンドウ全てのことを指します(ただし、ダイアログボックスやツールチップ等のポップアップ表示されるウィンドウを除く)。
このウィンドウを配置できる領域は、ウィンドウのクライアント領域の四辺に接する矩形に制限されます。
このため、便宜上、ツールバーと呼んでいるのです。底辺に配置されるウィンドウは、あたかもステータスバーのように動作するかもしれませんが・・・。
サンプルソースを先出しにするのが、主流になりつつあります。
VB.NETサンプルソース:chap9.vb.lzh(34KB未満 2005/1/6)
下の図は、Word文書をインプレースアクティブ化し、ツールバーを表示してみたところです。

下の図では、ツールバーの1つを左辺に移動してみました。

なぜ、Word文書なのかと言うと、現在のクライアントが完全ではないため、Wordしかツールバーを表示してくれませんでした。
ちなみに、Excel2000では、この古い形式のインプレース編集は、既にサポートされなくなっています。
Excel2000以降でインプレース編集するためには、OLE2の時代よりも多少下って、ActiveXの時代にならなければなりません。
▼ 2004/7/2 追記 ▼
Excelとペイントブラシが、インプレースアクティブ化できないのは、OLEサーバの起動方法が仕様に沿っていないことに起因しているようです。
OLEサーバの起動方法に問題があることは認識していたのですが、ここで問題になるとは考えていませんでした。
OLEの機能を利用したソフトを作成する場合、こういった形の中途半端な実装は行わないので、やってみるまで分からなかったと言うのが、実際のところです。
何が問題となっているかを調べるだけでも、結構な時間を費やしてしまいました。この問題は次章で対応します。
▲ 2004/7/2 追記 ▲
2.IOleInPlaceUIWindowとIOleInPlaceActiveObject
ツールバーを表示するためにOLEサーバ側が使用するインターフェースは、IOleInPlaceUIWindowです。
さらに、IOleInPlaceUIWindowを継承しているIOleInPlaceFrameもこれに該当します。
これらインターフェースの3つのメソッド GetBorder、RequestBorderSpace、およびSetBorderSpaceが、ツールバーの配置に使われます。
GetBorderメソッドは、ツールバーを配置可能な全領域を取得します。
RequestBorderSpaceメソッドは、指定領域にツールバーが配置可能かどうかを問い合わせます。このメソッドは行儀の良いOLEサーバしか使用しません。
SetBorderSpaceメソッドは、指定領域をツールバー配置領域として確保します。
これら3つのメソッドは、input_sync属性が定義されているため、このメソッドの処理中にメッセージループを使用してはなりません。
これは、ダイアログボックスの表示や、アパートメント境界を越えたCOMの呼び出し等、暗黙的にメッセージループを使用する処理全てが含まれます。
注意しなければならないのが、OLEサーバがアウトプロセスである場合、OLEサーバの呼び出しは、アパートメント境界を越えたCOMの呼び出しに該当することです。
クライアント側が使用するインターフェースは、IOleInPlaceActiveObjectです。
このインターフェースのメソッドResizeBorderは、クライアントがOLEサーバに対して、ツールバーの配置領域が変更されたことを、通知するのに使用されます。
このインターフェースは、メッセージループを使用することが許可されています。
その理由は、クライアント側の要求によってOLEサーバの状態を変更する、という設計思想に基づいていると思われます。
3.まとめ
これで、ツールバーを表示するのに、最低限の準備が出来たと言えます。
この辺りから、クライアントの動作によって、サーバの動作が激変する、OLEの標準化された世界が見えてきます。
「それのどこが標準やねん!」と突っ込みたくなりますが、それが許されたために様々なOLEサーバ製品が登場した、と思っておきましょう。
最後に、ツールバーを配置するためのOLEサーバとクライアントのやり取りを、ボーダースペースネゴシエーション(negotiate border space)とか呼んだりするのですが、このカタカナ語は一般的ではありません。
前へ 次へ
OLE on .NET Frameworkへ
総合トップへ