サーバー : サーバー アイテム
更新 : 2007 年 11 月
コンテナが OLE 埋め込みアイテムまたはリンク アイテムを編集するためにサーバーを起動すると、サーバー アプリケーションは "サーバー アイテム" を作成します。サーバー アイテムは、COleServerItem の派生クラスのオブジェクトであり、サーバー ドキュメントとコンテナ アプリケーション間のインターフェイスになります。
COleServerItem クラスには、オーバーライド可能なメンバ関数があります。通常、これらの関数は、コンテナからの要求が発生すると OLE から呼び出されます。サーバー アイテムは、サーバー ドキュメントの一部あるいは全体を表すことができます。OLE アイテムが埋め込みアイテムのときは、サーバー アイテムはサーバー ドキュメント全体を表します。OLE アイテムがリンク アイテムのときは、サーバー アイテムは、リンクの範囲に応じて、サーバー ドキュメントの一部または全体を表します。
たとえば、サンプル アプリケーション HIERSVR では、サーバー アイテム クラス CServerItem のメンバとして、CServerNode クラスのオブジェクトへのポインタがあります。HIERSVR アプリケーションのドキュメント全体はツリー構造になっていて、CServerNode オブジェクトはツリー中のノードを表します。CServerNode オブジェクトがルート ノードのときは、CServerItem オブジェクトはドキュメント全体を表します。CServerNode オブジェクトが子ノードのときは、CServerItem オブジェクトはドキュメントの一部を表します。この相互作用の一例として、MFC の OLE サンプル プログラム HIERSVR を参照してください。
サーバー アイテムの実装
アプリケーション ウィザードを使ってアプリケーションの初期コードを作成する場合は、[複合ドキュメント サポート] ページでいずれかのサーバー オプションを選択すると、サーバー アイテムを含む初期コードが作成されます。既存のアプリケーションを改良してサーバー アイテムを付加する場合は、次の手順に従ってください。
サーバー アイテムを実装するには
COleServerItem の派生クラスを作成します。
この派生クラスで、メンバ関数 OnDraw をオーバーライドします。
フレームワークは OnDraw を呼び出して、OLE アイテムをメタファイルにレンダリングします。コンテナ アプリケーションは、このメタファイルを使ってアイテムをレンダリングします。サーバーのビュー クラスにもメンバ関数 OnDraw がありますが、これはサーバー アプリケーションがアクティブなときにアイテムをレンダリングするために利用されます。
サーバー ドキュメント クラスのオーバーライド版 OnGetEmbeddedItem を実装します。詳細については、「サーバー : サーバー ドキュメントの実装」およびサンプル アプリケーション HIERSVR を参照してください。
サーバー アイテム クラスのメンバ関数 OnGetExtent を実装します。この関数は、アイテムのサイズを調べるために、フレームワークから呼び出されます。既定の実装では、何も行われません。
サーバー アイテムの動作のしくみ
「サーバー アイテムの実装」で説明したように、サーバー アプリケーションは、サーバーのビューとコンテナ アプリケーションが利用するメタファイルの両方に、アイテムをレンダリングする必要があります。MFC ライブラリのアプリケーション アーキテクチャでは、ビュー クラスのメンバ関数 OnDraw は、アイテムの編集時にアイテムをレンダリングします (『MFC リファレンス』の「CView::OnDraw」を参照してください)。一方、サーバー アイテムの OnDraw は、編集時以外のすべての場合に、アイテムをメタファイルにレンダリングします (「COleServerItem::OnDraw」を参照してください)。
コードの重複を避けるには、サーバー ドキュメント クラスのヘルパ関数を作成し、ビュー クラスとサーバー アイテム クラスの関数 OnDraw からこのヘルパ関数を呼び出します。MFC の OLE サンプル アプリケーション HIERSVR では、この方法を使っています。つまり、関数 CServerView::OnDraw および CServerItem::OnDraw から CServerDoc::DrawTree を呼び出してアイテムをレンダリングします。
ビュー とサーバー アイテムの両方にメンバ関数 OnDraw があるのは、レンダリングを行う環境が異なるためです。ビュー クラスでは、拡大、選択、クリッピングなどの条件、およびスクロール バーなどのユーザー インターフェイスを考慮する必要があります。一方、サーバー アイテム クラスでは、常に OLE オブジェクト全体をレンダリングします。
詳細については、『MFC リファレンス』の「CView::OnDraw」、「COleServer Item」、「COleServerItem::OnDraw」、および「COleServerDoc::OnGetEmbeddedItem」を参照してください。