IOleDocumentView
COM公式ドキュメント
IOleDocumentView インターフェースは、コンテナーがドキュメントオブジェクトのサポートする各ビューと通信できるようにします。
メソッド 13
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
コンテナーのドキュメントビューサイトを、ドキュメントのビューオブジェクトに関連付けます。
| pIPSite | IOleInPlaceSite* | in | ドキュメントビューサイトの IOleInPlaceSite インターフェースへのポインター。このパラメーターには NULL を指定できます。その場合、ドキュメントビューオブジェクトはコンテナーとのすべての関連付けを失います。 |
戻り値
このメソッドは、ドキュメントビューサイトがドキュメントビューオブジェクトに正常に関連付けられた場合(pIPSite が NULL の場合は関連付けが解除された場合)に S_OK を返します。その他に返される可能性のある値は次のとおりです。
| Return code | Description |
|---|---|
| 操作が失敗しました。 |
解説(Remarks)
ドキュメントオブジェクトをアクティブ化する処理の一環として、コンテナーはコンテナー側の IOleInPlaceSite 実装へのポインターをオブジェクトに渡す必要があります。このポインターは、このメソッドが呼び出されるビューに関連付けられるドキュメントビューサイトを指定します。
通常、コンテナーはドキュメントからのアクティブ化要求に応じてこのポインターを渡します。ドキュメントは IOleDocumentSite::ActivateMe を呼び出し、アクティブ化するビューへのポインターをコンテナーに渡すことで、そのような要求を行います。コンテナーはこのポインターを使用して IOleDocumentView::SetInPlaceSite を呼び出します。
呼び出し側への注意
コンテナーが、ロード済みのドキュメントオブジェクトインスタンスのアクティブ化ではなく、ドキュメントオブジェクトの新しいインスタンスの作成とアクティブ化を要求する場合、ビューサイトは IOleDocument::CreateView の pIPSite 引数で渡されます。したがって、IOleDocumentView::SetInPlaceSite を明示的に呼び出す必要はありません。実装側への注意
すでにビューサイトに関連付けられているビューに対してこのメソッドが呼び出された場合、ビューは新しいサイトで自身をアクティブ化する準備として、いくつかの後始末を行う必要があります。まず、ビューは現在のサイトで自身を非アクティブ化し、そのサイトへのポインターを解放しなければなりません。次に、新しい IOleInPlaceSite ポインターが NULL でない場合、ビューはそのポインターを保存し、それに対して IUnknown::AddRef を呼び出す必要があります。その後、ビューはコンテナーから新しいビューサイトでのアクティブ化の指示を受け取るまで待機します。ドキュメントビューはこのメソッドを完全に実装しなければなりません。E_NOTIMPL は許容される戻り値ではありません。
このビューオブジェクトに関連付けられているビューサイトを取得します。
| ppIPSite | IOleInPlaceSite** | out | ドキュメントのビューサイトへのインターフェースポインターを受け取る IOleInPlaceSite ポインター変数へのポインター。 |
戻り値
解説(Remarks)
IOleDocumentView::GetInPlaceSite は、IOleDocumentView::SetInPlaceSite によって最後に渡された IOleInPlaceSite ポインターを取得します。IOleDocumentView::SetInPlaceSite がまだ呼び出されていない場合は NULL を返します。このポインターが NULL でない場合、このメソッドはそのポインターに対して IUnknown::AddRef を呼び出します。呼び出し側はそれを解放する責任があります。ドキュメントビューはこのメソッドを完全に実装しなければなりません。E_NOTIMPL は許容される戻り値ではありません。
このビューを所有するドキュメントオブジェクトの IUnknown インターフェースポインターを取得します。
| ppunk | IUnknown** | out | このビューを所有するドキュメントオブジェクトへのポインターを受け取る IUnknown インターフェースポインターへのポインター。 |
戻り値
解説(Remarks)
このメソッドで取得したインターフェースポインターの参照カウントをインクリメントするのは、呼び出し側の責任です。呼び出し側は、このポインターが不要になったときに IUnknown::Release を呼び出さなければなりません。
ビューオブジェクトは常にドキュメントオブジェクトに包含または集約されている必要があるため、このメソッドは常に成功します。戻る前に、このメソッドは ppunk に格納されたポインターに対して IUnknown::AddRef を呼び出す必要があります。
ビューをアクティブ化するビューポートの矩形座標を設定するか、現在ビューがアクティブ化されているビューポートの座標をリセットします。
| prcView | RECT* | in | ビューポートの座標を格納する RECT 構造体へのポインター。 |
戻り値
解説(Remarks)
シングルドキュメントインターフェース(SDI)アプリケーションの場合、ビューポートはフレームウィンドウのクライアント領域から、ツールバー、ステータスバーなどに割り当てられたスペースを除いた領域です。マルチドキュメントインターフェース(MDI)ウィンドウの場合、ビューポートは MDI ドキュメントウィンドウのクライアント領域から、その他のフレームレベルのユーザーインターフェース要素を除いた領域です。
呼び出し側への注意
IOleDocumentView::SetRect または IOleDocumentView::SetRectComplex の呼び出しは、ドキュメントオブジェクトの通常のアクティブ化シーケンスの一部であり、通常は IOleDocumentView::UIActivate の呼び出しに続き、IOleDocumentView::Show の呼び出しの前に行われます。ドキュメントオブジェクトの表示に使用されるウィンドウのサイズが変更されるたびに、コンテナーは IOleDocumentView::SetRect(または IOleDocumentView::SetRectComplex)を呼び出して、新しいウィンドウの寸法に合わせて自身のサイズを変更するようドキュメントビューオブジェクトに指示する必要があります。
実装側への注意
ビューポートの座標は、IOleWindow::GetWindow を通じて取得されるビューウィンドウの座標系内にあります。ビューは、prcView で渡された新しい座標に合わせて自身のサイズを変更しなければなりません。このメソッドは [input_sync] 属性で定義されています。これは、このメソッドの実行中、ビューオブジェクトが制御を譲ったり、input_sync 以外の別の RPC 呼び出しを行ったりできないことを意味します。
ドキュメントビューはこのメソッドを完全に実装しなければなりません。E_NOTIMPL は許容される戻り値ではありません。
ビューがアクティブ化される、またはアクティブ化されるビューポートの矩形座標を取得します。
| prcView | RECT* | out | IOleDocumentView::SetRect で設定された現在のビューポートの座標を格納する RECT 構造体へのポインター。 |
戻り値
このメソッドは成功時に S_OK を返します。その他に返される可能性のある値は次のとおりです。
| Return code | Description |
|---|---|
| このビューはまだ IOleDocumentView::SetRect または IOleDocumentView::SetRectComplex の呼び出しを受け取っていないため、返す矩形がありません。 |
解説(Remarks)
シングルドキュメントインターフェース(SDI)アプリケーションの場合、ビューポートはフレームウィンドウのクライアント領域から、ツールバー、ステータスバーなどに割り当てられたスペースを除いた領域です。マルチドキュメントインターフェース(MDI)ウィンドウの場合、ビューポートは MDI ドキュメントウィンドウのクライアント領域から、その他のフレームレベルのユーザーインターフェース要素を除いた領域です。
このメソッドで取得されるビューポート座標は、IOleDocumentView::SetRect または IOleDocumentView::SetRectComplex のいずれかの最も新しい呼び出しで設定されたものです。
ドキュメントビューはこのメソッドを完全に実装しなければなりません。E_NOTIMPL は許容される戻り値ではありません。
ビューポート、スクロールバー、およびサイズボックスの矩形座標を設定します。
| prcView | RECT* | in | ビューポートの座標を格納する RECT 構造体へのポインター。 |
| prcHScroll | RECT* | in | 水平スクロールバーの座標を格納する RECT 構造体へのポインター。 |
| prcVScroll | RECT* | in | 垂直スクロールバーの座標を格納する RECT 構造体へのポインター。 |
| prcSizeBox | RECT* | in | サイズボックスの座標を格納する RECT 構造体へのポインター。 |
戻り値
このメソッドは成功時に S_OK を返します。その他に返される可能性のある値は次のとおりです。
| Return code | Description |
|---|---|
| 操作が失敗しました。 | |
| このビューを所有するドキュメントオブジェクトは複合矩形をサポートしていません。 |
解説(Remarks)
単一のドキュメントが複数のシートやページで構成されるワークブックメタファーをサポートするビューフレームは、通常このメソッドを呼び出して、すべてのシートまたはページで共通に使用される座標を設定します。
呼び出し側への注意
IOleDocumentView::SetRectComplex の呼び出しは、複合矩形をサポートするドキュメントオブジェクトの通常のアクティブ化シーケンスの一部であり、通常は IOleDocumentView::UIActivate の呼び出しに続き、IOleDocumentView::Show の呼び出しの前に行われます。ドキュメントオブジェクトの表示に使用されるウィンドウのサイズが変更されるたびに、コンテナーは IOleDocumentView::SetRectComplex または IOleDocumentView::SetRect を呼び出して、新しいウィンドウの寸法に合わせて自身のサイズを変更するようビューオブジェクトに指示する必要があります。
実装側への注意
複合矩形をサポートするドキュメントオブジェクトは、DOCMISC および IOleDocument::GetDocMiscStatus で説明されているとおり、DOCMISC_SUPPORTCOMPLEXRECTANGLES で自身をマークします。このメソッドをサポートしないドキュメントオブジェクトは E_NOTIMPL を返すことができます。このメソッドの呼び出しを受け取ると、ビューは prcView で指定された座標に合わせて自身のサイズを変更し、スクロールバーとサイズボックスを prcHScroll、prcVScroll、prcSizeBox で指定された領域に合わせなければなりません。
このメソッドは [input_sync] 属性で定義されています。これは、このメソッドの実行中、実装オブジェクトが制御を譲ったり、input_sync 以外の別の RPC 呼び出しを行ったりできないことを意味します。
ビューをアクティブ化または非アクティブ化します。
| fShow | BOOL | in | TRUE の場合、ビューは自身を表示します。FALSE の場合、ビューは自身を非表示にします。 |
戻り値
このメソッドは成功時に S_OK を返します。その他に返される可能性のある値は次のとおりです。
| Return code | Description |
|---|---|
| 操作が失敗しました。 | |
| 操作に必要なメモリが不足しています。 | |
| 予期しないエラーが発生しました。 |
解説(Remarks)
Show の呼び出しはアクティブ化シーケンスの最後のステップです。なぜなら、自身を表示する前に、ドキュメントオブジェクトは占有するスペースを正確に把握し、すべてのツールを利用可能にしておく必要があるためです。
呼び出し側への注意
ビューをアクティブ化する目的でこのメソッドを呼び出す場合は、IOleDocumentView::SetInPlaceSite、IOleDocumentView::UIActivate、および IOleDocumentView::SetRect(または IOleDocumentView::SetRectComplex)の呼び出しの後に行う必要があります。実装側への注意
このメソッドの実装は、次の疑似コードを体現する必要があります。if (fShow)
{
In-place activate the view but do not UI activate it.
Show the view window.
}
else
{
Call IOleDocumentView::UIActivate(FALSE) on this view
Hide the view window
}
ドキュメントオブジェクトのすべてのビューは、少なくともインプレースアクティブ化をサポートしなければなりません。E_NOTIMPL は許容される値ではありません。
メニュー、ツールバー、アクセラレーターなど、ドキュメントビューのユーザーインターフェース要素をアクティブ化または非アクティブ化します。
| fUIActivate | BOOL | in | TRUE の場合、ビューは自身のユーザーインターフェースをアクティブ化します。FALSE の場合、ビューは自身のユーザーインターフェースを非アクティブ化します。 |
戻り値
このメソッドは成功時に S_OK を返します。その他に返される可能性のある値は次のとおりです。
| Return code | Description |
|---|---|
| 操作が失敗しました。 | |
| 操作に必要なメモリが不足しています。 | |
| 予期しないエラーが発生しました。 |
解説(Remarks)
呼び出し側への注意
IOleDocumentView::SetInPlaceSite を呼び出す前にこのメソッドを呼び出すと E_UNEXPECTED が返されます。これは、ビューが自身をアクティブ化できるようになる前に、ビューサイトに関連付けられている必要があるためです。IOleDocumentView::UIActivate をアクティブ化シーケンスの一部として呼び出す場合、この呼び出しは IOleDocumentView::SetRect または IOleDocumentView::SetRectComplex の呼び出しの前に行う必要があります。そうしないと、ビューの寸法にツールバーのスペースが反映されないためです。
ビューを非アクティブ化するには、コンテナーは IOleDocumentView::Show を FALSE で呼び出し、続いて IOleDocumentView::UIActivate を FALSE で呼び出す必要があります。
実装側への注意
このメソッドの実装は、次の疑似コードを体現する必要があります。if (fActivate)
{
UI activate the view (do menu merging, show frame level tools, process accelerators)
Take focus, and bring the view window forward.
}
else
call IOleInPlaceObject::UIDeactivate on this view
さらに、ビューは拡張された ヘルプ メニューのマージに参加でき、また参加すべきです。
ドキュメントオブジェクトのすべてのビューは、インプレースアクティブ化をサポートしなければなりません。E_NOTIMPL は許容される戻り値ではありません。
ドキュメントビューを別のポップアップウィンドウに表示します。セマンティクスは OLEIVERB_OPEN を指定した IOleObject::DoVerb と同等です。
戻り値
このメソッドは成功時に S_OK を返します。その他に返される可能性のある値は次のとおりです。
| Return code | Description |
|---|---|
| 操作が失敗しました。 | |
| 操作に必要なメモリが不足しています。 | |
| 予期しないエラーが発生しました。 | |
| このビューを所有するドキュメントオブジェクトは別ウィンドウでのアクティブ化をサポートしていません。 |
解説(Remarks)
ブラウザーや「バインダー」などのコンテナーアプリケーションでドキュメントオブジェクトを表示しているユーザーは、複数のビューやドキュメントを一度に表示したい場合があります。ブラウザーは一度に 1 つのビューしか表示しないため、コンテナーには、他のビューやドキュメントに対して必要に応じて別々のウィンドウで自身を表示するよう要求する手段が必要です。IOleDocumentView::Open メソッドはその手段を提供します。
呼び出し側への注意
IOleDocumentView::Open の呼び出しが成功した後は、IOleDocumentView::Show を呼び出して、ウィンドウを非表示にするか、ウィンドウを表示して前面に表示する必要があります。ビューが別ウィンドウでアクティブな間、コンテナーは必要な回数だけウィンドウを表示または非表示にできます。実装側への注意
ドキュメントオブジェクトは、DOCMISC_CANTOPENEDIT ステータスフラグを設定し、このメソッドを呼び出したコンテナーに E_NOTIMPL を返すことで、別ウィンドウでのアクティブ化をサポートしないことを示します。実装は主に、ビューオブジェクトが自身の IOleInPlaceObject::InPlaceDeactivate メソッドを呼び出すことで構成されます。これにより、ドキュメントオブジェクトは実行状態のままインプレースアクティブ化されていない状態になります。ドキュメントオブジェクトのユーザーインターフェースは、コンテナーが IOleDocumentView::Show を呼び出すまで表示されません(上記「呼び出し側への注意」を参照)。
ドキュメントビューに、自身を閉じて IOleInPlaceSite ポインターを解放するよう指示します。
| dwReserved | DWORD | in | このパラメーターは予約されており、NULL にすることはできません。 |
戻り値
このメソッドは成功時に S_OK を返します。
解説(Remarks)
別ウィンドウが不要になると、コンテナーは IOleDocumentView::CloseView を呼び出します。これにより、ビューは別ウィンドウへのサイトポインターを解放し、そのウィンドウを破棄します。アクティブドキュメントの通常のインプレース非アクティブ化シーケンスとは異なり、ドキュメントビューは引き続き IOleInPlaceSite ポインターを保持します。このポインターは、ビューのコンテナーが pIPSite を NULL に設定して SetInPlaceSite を呼び出すか、IOleDocumentView::CloseView を呼び出したときにのみ解放されます。
ユーザーがビューの別ウィンドウを閉じたとき、ビューは自身をシャットダウンすべきではありません。代わりに、IOleInPlaceSite::OnInPlaceActivate を呼び出す必要があります。その後、ビューサイトは IOleDocumentView::UIActivate を FALSE で直ちに呼び出すか、後で呼び出すかを決定します。このようにして、別ウィンドウに表示されているドキュメントビューは、コンテナー自身のウィンドウでのアクティブ化に引き続き利用できます。
コンテナーは、ビューを削除する前、つまりビューへの最後の参照を解放する前に、このメソッドを呼び出さなければなりません。一般に、このメソッドの実装は、ビューがまだ非表示になっていない場合に IOleDocumentView::Show を FALSE で呼び出してビューを非表示にし、その後 SetInPlaceSite を NULL で呼び出して自身を非アクティブ化し、ビューサイトポインターを解放します。
IOleDocumentView::CloseView は、コンテナーがビューを完全にシャットダウンしようとするときに呼び出されるため、このメソッドは実装されなければならず、失敗する理由はありません。
指定されたストリームにビューの状態を保存します。
| pstm | IStream* | in | ビューが状態データを保存するストリームへのポインター。 |
戻り値
このメソッドは成功時に S_OK を返します。その他に返される可能性のある値は次のとおりです。
| Return code | Description |
|---|---|
| pstm の値が NULL です。 | |
| このビューには保存する意味のある状態がありません。ほとんどのビューは保存する価値のある状態情報を少なくともいくらか持っているため、このエラーはまれです。 |
解説(Remarks)
ビューの状態には、ビューの種類、ズーム倍率、挿入ポイントの位置などのプロパティが含まれます。コンテナーは通常、ビューを非アクティブ化する前にこの関数を呼び出します。その後、このストリームを使用して、IOleDocumentView::ApplyViewState を通じて、同じドキュメントのビューをこの保存された状態に再初期化できます。
IPersistStream を規定する規則に従い、ビューはストリームの最初の要素として自身の CLSID を書き込まなければなりません。ドキュメントのストレージ表現に適用されるクロスプラットフォームのファイル形式互換性の問題は、このコンテキストにも適用されます。
IOleDocumentView::SaveViewState の呼び出しで以前に保存されたビュー状態でビューを初期化します。
| pstm | IStream* | in | ビューが自身を初期化するためのデータを含むストリームへのポインター。 |
戻り値
このメソッドは成功時に S_OK を返します。その他に返される可能性のある値は次のとおりです。
| Return code | Description |
|---|---|
| pstm の値が NULL です。 | |
| このビューには読み込む意味のある状態がありません。ほとんどのビューは読み込む価値のある状態情報を少なくともいくらか持っているため、このエラーはまれです。 |
解説(Remarks)
通常、この関数は、既存のビューがコンテナー内に作成された後、そのビューが表示される前に呼び出されます。ビューストリーム内のデータを検証するのはビューの責任であり、コンテナーはビューの状態データを解釈しようとはしません。
現在のビューと同一の内部状態を持つ複製ビューオブジェクトを作成します。
| pIPSiteNew | IOleInPlaceSite* | in | 新しいビューオブジェクトがアクティブ化されるビューサイトを表す IOleInPlaceSite インターフェースへのポインター。このポインターを受け取ると、複製されるビューはそれを新しいビューの IOleDocumentView::SetInPlaceSite メソッドに渡す必要があります。このポインターには NULL を指定できます。その場合、新しいビューに対して IOleDocumentView::SetInPlaceSite を直接呼び出すのは呼び出し側の責任です。 |
| ppViewNew | IOleDocumentView** | out | 新しいビューオブジェクトへのインターフェースポインターを受け取る IOleDocumentView ポインター変数へのポインター。呼び出し側は、ppViewNew が不要になったときにそれを解放する責任があります。 |
戻り値
このメソッドは成功時に S_OK を返します。その他に返される可能性のある値は次のとおりです。
| Return code | Description |
|---|---|
| 操作が失敗しました。 | |
| ppViewNew の値が NULL です。 | |
| ビューオブジェクトはこのインターフェースを実装していません。 |
解説(Remarks)
このメソッドは、複製されるビューと同じビューコンテキストを持ちながら、異なるビューポートとビューサイトを持つ新しいビューを作成するのに便利です。通常、MDI アプリケーションをホストするコンテナーは、「ウィンドウ/新しいウィンドウ」機能を提供するためにこのメソッドを呼び出します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IOleDocumentView "{B722BCC6-4E68-101B-A2BC-00AA00404770}" #usecom global IOleDocumentView IID_IOleDocumentView "{}" #comfunc global IOleDocumentView_SetInPlaceSite 3 sptr #comfunc global IOleDocumentView_GetInPlaceSite 4 sptr #comfunc global IOleDocumentView_GetDocument 5 sptr #comfunc global IOleDocumentView_SetRect 6 var #comfunc global IOleDocumentView_GetRect 7 var #comfunc global IOleDocumentView_SetRectComplex 8 var,var,var,var #comfunc global IOleDocumentView_Show 9 int #comfunc global IOleDocumentView_UIActivate 10 int #comfunc global IOleDocumentView_Open 11 #comfunc global IOleDocumentView_CloseView 12 int #comfunc global IOleDocumentView_SaveViewState 13 sptr #comfunc global IOleDocumentView_ApplyViewState 14 sptr #comfunc global IOleDocumentView_Clone 15 sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IOleDocumentView "{B722BCC6-4E68-101B-A2BC-00AA00404770}" #usecom global IOleDocumentView IID_IOleDocumentView "{}" #comfunc global IOleDocumentView_SetInPlaceSite 3 sptr #comfunc global IOleDocumentView_GetInPlaceSite 4 sptr #comfunc global IOleDocumentView_GetDocument 5 sptr #comfunc global IOleDocumentView_SetRect 6 sptr #comfunc global IOleDocumentView_GetRect 7 sptr #comfunc global IOleDocumentView_SetRectComplex 8 sptr,sptr,sptr,sptr #comfunc global IOleDocumentView_Show 9 int #comfunc global IOleDocumentView_UIActivate 10 int #comfunc global IOleDocumentView_Open 11 #comfunc global IOleDocumentView_CloseView 12 int #comfunc global IOleDocumentView_SaveViewState 13 sptr #comfunc global IOleDocumentView_ApplyViewState 14 sptr #comfunc global IOleDocumentView_Clone 15 sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。