Win32 API 日本語リファレンス
ホームSystem.Ole › IViewObject

IViewObject

COM
IID0000010d-0000-0000-c000-000000000046継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

オブジェクトが、呼び出し側にデータオブジェクトを渡すことなく、自身を直接表示できるようにします。さらに、このインターフェイスはアドバイズシンクとの接続を作成および管理でき、これによって呼び出し側はビューオブジェクトの変更を通知されることができます。

メソッド 6

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT Draw(DVASPECT dwDrawAspect, INT lindex, void* pvAspect, DVTARGETDEVICE* ptd, HDC hdcTargetDev, HDC hdcDraw, RECTL* lprcBounds, RECTL* lprcWBounds, INT_PTR pfnContinue, UINT_PTR dwContinue)

オブジェクトの表現を指定されたデバイスコンテキストに描画します。

dwDrawAspectDVASPECTin描画するアスペクト、すなわちオブジェクトをどのように表現するかを指定します。表現にはコンテンツ、アイコン、サムネイル、印刷ドキュメントなどがあります。有効な値は列挙型 DVASPECT および DVASPECT2 から取得します。最適化された描画インターフェイスをサポートする新しいオブジェクトおよびコンテナーは、DVASPECT2 列挙値をサポートします。最適化された描画インターフェイスをサポートしない古いオブジェクトおよびコンテナーは、DVASPECT2 をサポートしない場合があります。ウィンドウレスオブジェクトでは DVASPECT_CONTENT、DVASPECT_OPAQUE、および DVASPECT_TRANSPARENT のみが許可されます。
lindexINTin描画操作の対象となるオブジェクトの部分です。その解釈は dwAspect パラメーターの値によって異なります。詳細については DVASPECT 列挙型を参照してください。
pvAspectvoid*inout指定されたアスペクトに応じた描画の最適化を可能にする、DVASPECTINFO 構造体内の追加情報へのポインターです。最適化された描画インターフェイスをサポートする新しいオブジェクトおよびコンテナーは、このパラメーターもサポートします。最適化された描画インターフェイスをサポートしない古いオブジェクトおよびコンテナーは、このパラメーターに常に NULL を指定します。
ptdDVTARGETDEVICE*inoptionalオブジェクトのレンダリング対象となるデバイスを記述する DVTARGETDEVICE 構造体へのポインターです。NULL の場合、ビューは既定のターゲットデバイス(通常はディスプレイ)向けにレンダリングされます。NULL 以外の値は、hdcTargetDev および hdcDraw と組み合わせて解釈されます。たとえば、hdcDraw がデバイスコンテキストとしてプリンターを指定している場合、ptd パラメーターはそのプリンターデバイスを記述する構造体を指します。hdcTargetDev が有効な値であれば実際に印刷され、hdcTargetDevNULL であれば印刷プレビューモードで表示される場合があります。
hdcTargetDevHDCinoptionalptd パラメーターで示されるターゲットデバイスの情報コンテキストです。オブジェクトはここからデバイスメトリックを取得し、デバイスの機能をテストできます。ptdNULL の場合、オブジェクトは hdcTargetDev パラメーターの値を無視する必要があります。
hdcDrawHDCin描画先のデバイスコンテキストです。ウィンドウレスオブジェクトの場合、hdcDraw パラメーターは MM_TEXT マッピングモードであり、その論理座標が包含ウィンドウのクライアント座標に一致している必要があります。ウィンドウレスオブジェクトの場合、デバイスコンテキストは通常 WM_PAINT メッセージによって渡されるものと同じ状態である必要があります。
lprcBoundsRECTL*inoptionalオブジェクトを描画すべき、hdcDraw 上の矩形を指定する RECTL 構造体へのポインターです。このパラメーターはオブジェクトの位置決めと引き伸ばしを制御します。ウィンドウレスのインプレースアクティブなオブジェクトを描画する場合、このパラメーターは NULL にする必要があります。それ以外のすべての状況では、NULL は正当な値ではなく、E_INVALIDARG エラーコードを返す必要があります。コンテナーがウィンドウレスオブジェクトに NULL 以外の値を渡した場合、オブジェクトは要求されたアスペクトを指定されたデバイスコンテキストおよび矩形にレンダリングする必要があります。コンテナーは、オブジェクトの2つ目の非アクティブなビューをレンダリングするため、またはオブジェクトを印刷するために、ウィンドウレスオブジェクトにこれを要求できます。
lprcWBoundsRECTL*inoptional

hdcDraw がメタファイルのデバイスコンテキストである場合、基になるメタファイル内の境界矩形を指定する RECTL 構造体へのポインターです。この矩形構造体にはウィンドウ範囲とウィンドウ原点が含まれます。これらの値はメタファイルの描画に役立ちます。lprcBounds で示される矩形は、この lprcWBounds 矩形の内側に入れ子になっており、両者は同じ座標空間にあります。

hdcDraw がメタファイルのデバイスコンテキストでない場合、lprcWBoundsNULL になります。

pfnContinueINT_PTRinoptional

時間のかかる描画操作の間、ビューオブジェクトが操作を続行すべきか中止すべきかを判断するために定期的に呼び出すコールバック関数へのポインターです。この関数は描画を続行する場合に TRUE を返します。描画を停止する場合には FALSE を返し、その場合 IViewObject::Draw は DRAW_E_ABORT を返します。

dwContinue

dwContinueUINT_PTRinpfnContinue パラメーターが指す関数にパラメーターとして渡す値です。通常、dwContinue はコールバック関数内で必要となるアプリケーション定義の構造体へのポインターです。

戻り値

このメソッドは成功時に S_OK を返します。その他の可能な戻り値には以下があります。

Return code Description
OLE_E_BLANK
描画するデータがありません。
DRAW_E_ABORT
描画操作が中止されました。
VIEW_E_DRAW
描画中のエラーです。
DV_E_LINDEX
lindex の値が無効です。現在サポートされているのは -1 のみです。
DV_E_DVASPECT
dwAspect の値が無効です。
OLE_E_INVALIDRECT
矩形が無効です。

解説(Remarks)

コンテナーアプリケーションは、含まれるオブジェクトの表現を作成するために IViewObject::Draw を呼び出します。このメソッドは、指定されたビュー(dwAspect および pvAspect)の指定された部分(lindex)を、指定されたデバイスコンテキスト(hdcDraw)に描画します。書式設定、フォント、その他のレンダリングに関する判断は、ptd パラメーターで指定されたターゲットデバイスに基づいて行われます。

dwDrawAspect の値と lprcbounds の値の間には関係があります。lprcbounds の値は、描画をマッピングする対象となる hdcDraw 上の矩形を指定します。DVASPECT_THUMBNAIL、DVASPECT_ICON、および DVASPECT_SMALLICON の場合、オブジェクトは描画したいものを描画し、それを与えられた空間に最良の方法でマッピングします。一部のオブジェクトはフィットするようにスケーリングし、一部はフィットさせつつアスペクト比を維持します。さらに、描画が全幅で表示されるようにスケーリングするが下部が切り取られるものもあります。コンテナーは IOleObject::SetExtent を介してサイズを提案できますが、レンダリングサイズを制御することはできません。DVASPECT_CONTENT の場合、IViewObject::Draw の実装は、IOleObject::SetExtent によって与えられた範囲を使用するか、lprcBounds パラメーターで与えられた境界矩形を使用する必要があります。

最適化された描画技術をサポートする新しいオブジェクトおよびウィンドウレスオブジェクトの場合、このメソッドは次のように使用する必要があります。

描画の最適化をサポートしない古いオブジェクトおよびコンテナーとの互換性を維持するため、すべてのオブジェクトは、矩形かどうかにかかわらず、原点と矩形の範囲を保持することが求められます。これにより、コンテナーは埋め込まれたすべてのオブジェクトを依然として矩形とみなし、Draw で適切なレンダリング矩形を渡すことができます。

オブジェクトの範囲は描画アスペクトによって異なります。矩形でないオブジェクトの場合、範囲はアスペクト全体を覆う矩形のサイズにする必要があります。慣例により、オブジェクトの原点は DVASPECT_CONTENT アスペクトの矩形の左上隅です。言い換えれば、原点は矩形でないオブジェクトであっても、常にオブジェクトのサイトが保持する矩形の左上隅と一致します。

vtbl 4 HRESULT GetColorSet(DVASPECT dwDrawAspect, INT lindex, void* pvAspect, DVTARGETDEVICE* ptd, HDC hicTargetDev, LOGPALETTE** ppColorSet)

IViewObject::Draw メソッドで、対応するパラメーターを用いて描画する際にオブジェクトが使用する論理パレットを返します。

dwDrawAspectDVASPECTinオブジェクトをどのように表現するかを指定します。表現にはコンテンツ、アイコン、サムネイル、印刷ドキュメントなどがあります。有効な値は列挙型 DVASPECT から取得します。詳細については DVASPECT 列挙型を参照してください。
lindexINTin描画操作の対象となるオブジェクトの部分です。その解釈は dwDrawAspect によって異なります。詳細については DVASPECT 列挙型を参照してください。
pvAspectvoid*inoutdwDrawAspect で指定されたオブジェクトのビューに関する追加情報へのポインターです。現在のアスペクトはいずれも追加情報をサポートしていないため、pvAspect は常に NULL でなければなりません。
ptdDVTARGETDEVICE*inoptionalオブジェクトのレンダリング対象となるデバイスを記述する DVTARGETDEVICE 構造体へのポインターです。NULL の場合、ビューは既定のターゲットデバイス(通常はディスプレイ)向けにレンダリングされます。NULL 以外の値は、hicTargetDev および hdcDraw と組み合わせて解釈されます。たとえば、hdcDraw がデバイスコンテキストとしてプリンターを指定している場合、ptd はそのプリンターデバイスを記述する構造体を指します。hicTargetDev が有効な値であれば実際に印刷され、hicTargetDevNULL であれば印刷プレビューモードで表示される場合があります。
hicTargetDevHDCinoptionalptd パラメーターで示されるターゲットデバイスの情報コンテキストです。オブジェクトはここからデバイスメトリックを取得し、デバイスの機能をテストできます。ptdNULL の場合、オブジェクトは hicTargetDev パラメーターを無視する必要があります。
ppColorSetLOGPALETTE**outLOGPALETTE 構造体へのポインターを受け取る LOGPALETTE ポインター変数のアドレスです。この LOGPALETTE 構造体には、dwAspectlindexpvAspectptd、および hicTargetDev に同じパラメーターを指定して IViewObject::Draw を呼び出した場合に使用される色のセットが含まれます。ppColorSetNULL の場合、オブジェクトはパレットを使用しません。

戻り値

このメソッドは成功時に S_OK を返します。その他の可能な戻り値には以下があります。

Return code Description
S_FALSE
色のセットが空であるか、オブジェクトが情報を提供しません。
OLE_E_BLANK
オブジェクトのプレゼンテーションデータがありません。
DV_E_LINDEX
lindex の値が無効です。現在サポートされているのは -1 のみです。
DV_E_DVASPECT
dwAspect の値が無効です。
E_INVALIDARG
指定されたパラメーター値の1つ以上が無効です。
E_OUTOFMEMORY
この操作に利用できるメモリが不足しています。

解説(Remarks)

IViewObject::GetColorSet メソッドは、入れ子になったオブジェクトを再帰的に問い合わせ、要求されたすべての色の和集合を表す色のセットを返します。色のセットは最終的に、ウィンドウフレームを所有する最上位のコンテナーへと集約されます。このコンテナーは、埋め込まれた各オブジェクトに対して IViewObject::GetColorSet を呼び出すことで、埋め込みオブジェクトの描画に必要なすべての色を取得できます。コンテナーは、取得した色のセットを自身に必要なその他の色と組み合わせて使用し、全体の色パレットを設定できます。

OLE が提供する IViewObject::GetColorSet の実装は、絵を描画するために手元にあるデータを調べます。描画形式が CF_DIB の場合、ビットマップ内のパレットが使用されます。通常のビットマップの場合、色情報は返されません。描画形式がメタファイルの場合、オブジェクトハンドラーはメタファイルを列挙して CreatePalette メタファイルレコードを探します。見つかった場合、ハンドラーはそれを色のセットとして使用します。

vtbl 5 HRESULT Freeze(DVASPECT dwDrawAspect, INT lindex, void* pvAspect, DWORD* pdwFreeze)

オブジェクトの描画された表現を、IViewObject::Unfreeze メソッドが呼び出されるまで変化しないように固定します。このメソッドの最も一般的な用途はバンド印刷です。

dwDrawAspectDVASPECTinオブジェクトをどのように表現するかを指定します。表現にはコンテンツ、アイコン、サムネイル、印刷ドキュメントなどがあります。有効な値は列挙型 DVASPECT から取得します。詳細については DVASPECT 列挙型を参照してください。
lindexINTin描画操作の対象となるオブジェクトの部分です。その解釈は dwAspect によって異なります。詳細については DVASPECT 列挙型を参照してください。
pvAspectvoid*inoutdwAspect で指定されたオブジェクトのビューに関する追加情報へのポインターです。現在のアスペクトはいずれも追加情報をサポートしていないため、pvAspect は常に NULL でなければなりません。
pdwFreezeDWORD*out識別用の DWORD キーが返される場所へのポインターです。この一意のキーは、後で IViewObject::Unfreeze を呼び出して固定を解除する際に使用されます。このキーは、既定のキャッシュがどのオブジェクトが固定されているかを追跡するために使用するインデックスです。

戻り値

このメソッドは成功時に S_OK を返します。その他の可能な戻り値には以下があります。

Return code Description
VIEW_S_ALREADY_FROZEN
プレゼンテーションは既に固定されています。pdwFreeze の値は、既に固定されているオブジェクトの識別キーです。
OLE_E_BLANK
プレゼンテーションがキャッシュにありません。
DV_E_LINDEX
lindex の値が無効です。現在サポートされているのは -1 のみです。
DV_E_DVASPECT
dwAspect の値が無効です。

解説(Remarks)

IViewObject::Freeze メソッドは、後続の IViewObject::Unfreeze の呼び出しによって解放されるまで、ビューオブジェクトに描画された表現を固定させます。IViewObject::Freeze を呼び出した後は、同じパラメーターで IViewObject::Draw を連続して呼び出しても、IViewObject::Unfreeze が呼び出されるまで同じ絵が生成されます。

IViewObject::Freeze はオブジェクトの永続的な状態の一部ではなく、オブジェクトのアンロードおよび再読み込みをまたいで維持されることはありません。

このメソッドの最も一般的な用途はバンド印刷です。

固定状態の間、ビュー通知は送信されません。保留中のビュー通知は、後続の IViewObject::Unfreeze の呼び出しまで延期されます。

vtbl 6 HRESULT Unfreeze(DWORD dwFreeze)

IViewObject::Freeze を使用して以前に固定された描画を解放します。このメソッドの最も一般的な用途はバンド印刷です。

dwFreezeDWORDinどのビューオブジェクトの固定を解除するかを決定する、IViewObject::Freeze から以前に返されたキーを含みます。

戻り値

このメソッドは成功時に S_OK を返します。その他の可能な戻り値には以下があります。

Return code Description
OLE_E_NOCONNECTION
固定解除の処理中にエラーが発生したか、オブジェクトが現在固定されていません。
vtbl 7 HRESULT SetAdvise(DVASPECT aspects, DWORD advf, IAdviseSink* pAdvSink)

ビューオブジェクトとアドバイズシンクの間に接続を確立し、アドバイズシンクがオブジェクトのビューの変更について通知を受けられるようにします。

aspectsDVASPECTinアドバイザリ接続を設定する対象のビューです。有効な値は列挙型 DVASPECT から取得します。詳細については DVASPECT 列挙型を参照してください。
advfDWORDin

アドバイザリ接続を制御するためのフラグのグループを含みます。有効な値は列挙型 ADVF から取得します。ただし、このメソッドに関連するのは ADVF 値の一部のみです。次の表では関連する値を簡単に説明します。より詳細な説明については ADVF 列挙型を参照してください。

Value Meaning
ADVF_ONLYONCE
最初の通知が送信された後にアドバイザリ接続を破棄させます。
ADVF_PRIMEFIRST
データが現在の状態から変化したかどうかにかかわらず、初回の通知を送信させます。
Note ADVF_ONLYONCEADVF_PRIMEFIRST を組み合わせることで、IDataObject::GetData への非同期呼び出しを提供できます。
pAdvSinkIAdviseSink*in変更を通知されるアドバイザリシンク上の IAdviseSink インターフェイスへのポインターです。NULL 値は既存のアドバイザリ接続を削除します。

戻り値

このメソッドは成功時に S_OK を返します。その他の可能な戻り値には以下があります。

Return code Description
OLE_E_ADVISENOTSUPPORTED
アドバイザリ通知はサポートされていません。
DV_E_DVASPECT
dwAspect の値が無効です。
E_INVALIDARG
指定された値の1つ以上が無効です。
E_OUTOFMEMORY
この操作に利用できるメモリが不足しています。

解説(Remarks)

ビューオブジェクトに対して描画操作を要求するコンテナーアプリケーションは、IViewObject::SetAdvise メソッドで登録することにより、ビューオブジェクトのプレゼンテーションが変化したときに通知を受けることもできます。オブジェクトの基になるデータがいつ変化するかを知るには、IDataObject::DAdvise を別途呼び出す必要があります。

既存のアドバイザリ接続を削除するには、pAdvSinkNULL に設定して IViewObject::SetAdvise メソッドを呼び出します。

ビューオブジェクトが変化すると、適切なアドバイズシンクの IAdviseSink::OnViewChange メソッドを通じて呼び出しが行われます。

任意の時点で、特定のビューオブジェクトがサポートできるアドバイザリ接続は1つだけです。したがって、IViewObject::SetAdvise が呼び出された時点でビューオブジェクトが既にアドバイズシンクポインターを保持している場合、OLE は新しいポインターが登録される前に既存のポインターを解放します。

vtbl 8 HRESULT GetAdvise(DWORD* pAspects, DWORD* pAdvf, IAdviseSink** ppAdvSink)

直近の IViewObject::SetAdvise 呼び出しで使用された、オブジェクト上のアドバイザリ接続を取得します。

pAspectsDWORD*outoptional直前の IViewObject::SetAdvise 呼び出しの dwAspect パラメーターが返される場所へのポインターです。このポインターが NULL の場合、呼び出し側はこの値の返却を許可しません。
pAdvfDWORD*outoptional直前の IViewObject::SetAdvise 呼び出しの advf パラメーターが返される場所へのポインターです。このポインターが NULL の場合、呼び出し側はこの値の返却を許可しません。
ppAdvSinkIAdviseSink**outアドバイズシンクへのインターフェイスポインターを受け取る IAdviseSink ポインター変数のアドレスです。このアドバイズシンクへの接続は、pAdvSink パラメーターを提供する以前の IViewObject::SetAdvise 呼び出しで確立されている必要があります。ppvAdvSinkNULL の場合、確立されたアドバイザリ接続はありません。

戻り値

このメソッドは成功時に S_OK を返します。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

出力引数:
#define global IID_IViewObject "{0000010D-0000-0000-C000-000000000046}"
#usecom global IViewObject IID_IViewObject "{}"
#comfunc global IViewObject_Draw         3 int,int,sptr,var,sptr,sptr,var,var,sptr,sptr
#comfunc global IViewObject_GetColorSet  4 int,int,sptr,var,sptr,var
#comfunc global IViewObject_Freeze       5 int,int,sptr,var
#comfunc global IViewObject_Unfreeze     6 int
#comfunc global IViewObject_SetAdvise    7 int,int,sptr
#comfunc global IViewObject_GetAdvise    8 var,var,sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。