IViewObject
COM公式ドキュメント
オブジェクトが、呼び出し側にデータオブジェクトを渡すことなく、自身を直接表示できるようにします。さらに、このインターフェイスはアドバイズシンクとの接続を作成および管理でき、これによって呼び出し側はビューオブジェクトの変更を通知されることができます。
メソッド 6
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
オブジェクトの表現を指定されたデバイスコンテキストに描画します。
| dwDrawAspect | DVASPECT | in | 描画するアスペクト、すなわちオブジェクトをどのように表現するかを指定します。表現にはコンテンツ、アイコン、サムネイル、印刷ドキュメントなどがあります。有効な値は列挙型 DVASPECT および DVASPECT2 から取得します。最適化された描画インターフェイスをサポートする新しいオブジェクトおよびコンテナーは、DVASPECT2 列挙値をサポートします。最適化された描画インターフェイスをサポートしない古いオブジェクトおよびコンテナーは、DVASPECT2 をサポートしない場合があります。ウィンドウレスオブジェクトでは DVASPECT_CONTENT、DVASPECT_OPAQUE、および DVASPECT_TRANSPARENT のみが許可されます。 |
| lindex | INT | in | 描画操作の対象となるオブジェクトの部分です。その解釈は dwAspect パラメーターの値によって異なります。詳細については DVASPECT 列挙型を参照してください。 |
| pvAspect | void* | inout | 指定されたアスペクトに応じた描画の最適化を可能にする、DVASPECTINFO 構造体内の追加情報へのポインターです。最適化された描画インターフェイスをサポートする新しいオブジェクトおよびコンテナーは、このパラメーターもサポートします。最適化された描画インターフェイスをサポートしない古いオブジェクトおよびコンテナーは、このパラメーターに常に NULL を指定します。 |
| ptd | DVTARGETDEVICE* | inoptional | オブジェクトのレンダリング対象となるデバイスを記述する DVTARGETDEVICE 構造体へのポインターです。NULL の場合、ビューは既定のターゲットデバイス(通常はディスプレイ)向けにレンダリングされます。NULL 以外の値は、hdcTargetDev および hdcDraw と組み合わせて解釈されます。たとえば、hdcDraw がデバイスコンテキストとしてプリンターを指定している場合、ptd パラメーターはそのプリンターデバイスを記述する構造体を指します。hdcTargetDev が有効な値であれば実際に印刷され、hdcTargetDev が NULL であれば印刷プレビューモードで表示される場合があります。 |
| hdcTargetDev | HDC | inoptional | ptd パラメーターで示されるターゲットデバイスの情報コンテキストです。オブジェクトはここからデバイスメトリックを取得し、デバイスの機能をテストできます。ptd が NULL の場合、オブジェクトは hdcTargetDev パラメーターの値を無視する必要があります。 |
| hdcDraw | HDC | in | 描画先のデバイスコンテキストです。ウィンドウレスオブジェクトの場合、hdcDraw パラメーターは MM_TEXT マッピングモードであり、その論理座標が包含ウィンドウのクライアント座標に一致している必要があります。ウィンドウレスオブジェクトの場合、デバイスコンテキストは通常 WM_PAINT メッセージによって渡されるものと同じ状態である必要があります。 |
| lprcBounds | RECTL* | inoptional | オブジェクトを描画すべき、hdcDraw 上の矩形を指定する RECTL 構造体へのポインターです。このパラメーターはオブジェクトの位置決めと引き伸ばしを制御します。ウィンドウレスのインプレースアクティブなオブジェクトを描画する場合、このパラメーターは NULL にする必要があります。それ以外のすべての状況では、NULL は正当な値ではなく、E_INVALIDARG エラーコードを返す必要があります。コンテナーがウィンドウレスオブジェクトに NULL 以外の値を渡した場合、オブジェクトは要求されたアスペクトを指定されたデバイスコンテキストおよび矩形にレンダリングする必要があります。コンテナーは、オブジェクトの2つ目の非アクティブなビューをレンダリングするため、またはオブジェクトを印刷するために、ウィンドウレスオブジェクトにこれを要求できます。 |
| lprcWBounds | RECTL* | inoptional | hdcDraw がメタファイルのデバイスコンテキストである場合、基になるメタファイル内の境界矩形を指定する RECTL 構造体へのポインターです。この矩形構造体にはウィンドウ範囲とウィンドウ原点が含まれます。これらの値はメタファイルの描画に役立ちます。lprcBounds で示される矩形は、この lprcWBounds 矩形の内側に入れ子になっており、両者は同じ座標空間にあります。 hdcDraw がメタファイルのデバイスコンテキストでない場合、lprcWBounds は NULL になります。 |
| pfnContinue | INT_PTR | inoptional | 時間のかかる描画操作の間、ビューオブジェクトが操作を続行すべきか中止すべきかを判断するために定期的に呼び出すコールバック関数へのポインターです。この関数は描画を続行する場合に TRUE を返します。描画を停止する場合には FALSE を返し、その場合 IViewObject::Draw は DRAW_E_ABORT を返します。 dwContinue |
| dwContinue | UINT_PTR | in | pfnContinue パラメーターが指す関数にパラメーターとして渡す値です。通常、dwContinue はコールバック関数内で必要となるアプリケーション定義の構造体へのポインターです。 |
戻り値
このメソッドは成功時に S_OK を返します。その他の可能な戻り値には以下があります。
| Return code | Description |
|---|---|
| 描画するデータがありません。 | |
|
描画操作が中止されました。 |
| 描画中のエラーです。 | |
| lindex の値が無効です。現在サポートされているのは -1 のみです。 | |
| dwAspect の値が無効です。 | |
| 矩形が無効です。 |
解説(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 パラメーターで与えられた境界矩形を使用する必要があります。
最適化された描画技術をサポートする新しいオブジェクトおよびウィンドウレスオブジェクトの場合、このメソッドは次のように使用する必要があります。
- DVASPECT2 で定義されている新しい描画アスペクトが dwAspect でサポートされます。
- pvAspect パラメーターを使用して、DVASPECTINFO 構造体を通じて描画の最適化を可能にする追加情報を渡すことができます。
- IViewObject::Draw メソッドは、lrpcBounds パラメーターを NULL に設定することで、ウィンドウレスのインプレースアクティブなオブジェクトを再描画するために呼び出すことができます。それ以外のすべての状況では、NULL は不正な値であり、E_INVALIDARG エラーコードを返す必要があります。ウィンドウレスオブジェクトは、このパラメーターを使用する代わりに、アクティブ化動詞によって渡された矩形を使用するか、IOleInPlaceObject::SetObjectRects を呼び出します。コンテナーがウィンドウレスオブジェクトに NULL 以外の値を渡した場合、オブジェクトは要求されたアスペクトを指定されたデバイスコンテキストおよび矩形にレンダリングする必要があります。コンテナーは、オブジェクトの2つ目の非アクティブなビューをレンダリングするため、またはオブジェクトを印刷するために、ウィンドウレスオブジェクトにこれを要求できます。ウィンドウレスオブジェクトの描画の詳細については、IOleInPlaceSiteWindowless インターフェイスを参照してください。
- ウィンドウレスオブジェクトの場合、dwAspect パラメーターでは DVASPECT_CONTENT、DVASPECT_OPAQUE、および DVASPECT_TRANSPARENT のアスペクトのみが許可されます。
- ウィンドウレスオブジェクトの場合、hdcDraw パラメーターは MM_TEXT マッピングモードであり、その論理座標が包含ウィンドウのクライアント座標に一致している必要があります。ウィンドウレスオブジェクトの場合、デバイスコンテキストは通常 WM_PAINT メッセージによって渡されるものと同じ状態である必要があります。
オブジェクトの範囲は描画アスペクトによって異なります。矩形でないオブジェクトの場合、範囲はアスペクト全体を覆う矩形のサイズにする必要があります。慣例により、オブジェクトの原点は DVASPECT_CONTENT アスペクトの矩形の左上隅です。言い換えれば、原点は矩形でないオブジェクトであっても、常にオブジェクトのサイトが保持する矩形の左上隅と一致します。
IViewObject::Draw メソッドで、対応するパラメーターを用いて描画する際にオブジェクトが使用する論理パレットを返します。
| dwDrawAspect | DVASPECT | in | オブジェクトをどのように表現するかを指定します。表現にはコンテンツ、アイコン、サムネイル、印刷ドキュメントなどがあります。有効な値は列挙型 DVASPECT から取得します。詳細については DVASPECT 列挙型を参照してください。 |
| lindex | INT | in | 描画操作の対象となるオブジェクトの部分です。その解釈は dwDrawAspect によって異なります。詳細については DVASPECT 列挙型を参照してください。 |
| pvAspect | void* | inout | dwDrawAspect で指定されたオブジェクトのビューに関する追加情報へのポインターです。現在のアスペクトはいずれも追加情報をサポートしていないため、pvAspect は常に NULL でなければなりません。 |
| ptd | DVTARGETDEVICE* | inoptional | オブジェクトのレンダリング対象となるデバイスを記述する DVTARGETDEVICE 構造体へのポインターです。NULL の場合、ビューは既定のターゲットデバイス(通常はディスプレイ)向けにレンダリングされます。NULL 以外の値は、hicTargetDev および hdcDraw と組み合わせて解釈されます。たとえば、hdcDraw がデバイスコンテキストとしてプリンターを指定している場合、ptd はそのプリンターデバイスを記述する構造体を指します。hicTargetDev が有効な値であれば実際に印刷され、hicTargetDev が NULL であれば印刷プレビューモードで表示される場合があります。 |
| hicTargetDev | HDC | inoptional | ptd パラメーターで示されるターゲットデバイスの情報コンテキストです。オブジェクトはここからデバイスメトリックを取得し、デバイスの機能をテストできます。ptd が NULL の場合、オブジェクトは hicTargetDev パラメーターを無視する必要があります。 |
| ppColorSet | LOGPALETTE** | out | LOGPALETTE 構造体へのポインターを受け取る LOGPALETTE ポインター変数のアドレスです。この LOGPALETTE 構造体には、dwAspect、lindex、pvAspect、ptd、および hicTargetDev に同じパラメーターを指定して IViewObject::Draw を呼び出した場合に使用される色のセットが含まれます。ppColorSet が NULL の場合、オブジェクトはパレットを使用しません。 |
戻り値
このメソッドは成功時に S_OK を返します。その他の可能な戻り値には以下があります。
| Return code | Description |
|---|---|
| 色のセットが空であるか、オブジェクトが情報を提供しません。 | |
| オブジェクトのプレゼンテーションデータがありません。 | |
| lindex の値が無効です。現在サポートされているのは -1 のみです。 | |
| dwAspect の値が無効です。 | |
| 指定されたパラメーター値の1つ以上が無効です。 | |
| この操作に利用できるメモリが不足しています。 |
解説(Remarks)
IViewObject::GetColorSet メソッドは、入れ子になったオブジェクトを再帰的に問い合わせ、要求されたすべての色の和集合を表す色のセットを返します。色のセットは最終的に、ウィンドウフレームを所有する最上位のコンテナーへと集約されます。このコンテナーは、埋め込まれた各オブジェクトに対して IViewObject::GetColorSet を呼び出すことで、埋め込みオブジェクトの描画に必要なすべての色を取得できます。コンテナーは、取得した色のセットを自身に必要なその他の色と組み合わせて使用し、全体の色パレットを設定できます。
OLE が提供する IViewObject::GetColorSet の実装は、絵を描画するために手元にあるデータを調べます。描画形式が CF_DIB の場合、ビットマップ内のパレットが使用されます。通常のビットマップの場合、色情報は返されません。描画形式がメタファイルの場合、オブジェクトハンドラーはメタファイルを列挙して CreatePalette メタファイルレコードを探します。見つかった場合、ハンドラーはそれを色のセットとして使用します。
オブジェクトの描画された表現を、IViewObject::Unfreeze メソッドが呼び出されるまで変化しないように固定します。このメソッドの最も一般的な用途はバンド印刷です。
| dwDrawAspect | DVASPECT | in | オブジェクトをどのように表現するかを指定します。表現にはコンテンツ、アイコン、サムネイル、印刷ドキュメントなどがあります。有効な値は列挙型 DVASPECT から取得します。詳細については DVASPECT 列挙型を参照してください。 |
| lindex | INT | in | 描画操作の対象となるオブジェクトの部分です。その解釈は dwAspect によって異なります。詳細については DVASPECT 列挙型を参照してください。 |
| pvAspect | void* | inout | dwAspect で指定されたオブジェクトのビューに関する追加情報へのポインターです。現在のアスペクトはいずれも追加情報をサポートしていないため、pvAspect は常に NULL でなければなりません。 |
| pdwFreeze | DWORD* | out | 識別用の DWORD キーが返される場所へのポインターです。この一意のキーは、後で IViewObject::Unfreeze を呼び出して固定を解除する際に使用されます。このキーは、既定のキャッシュがどのオブジェクトが固定されているかを追跡するために使用するインデックスです。 |
戻り値
このメソッドは成功時に S_OK を返します。その他の可能な戻り値には以下があります。
| Return code | Description |
|---|---|
| プレゼンテーションは既に固定されています。pdwFreeze の値は、既に固定されているオブジェクトの識別キーです。 | |
| プレゼンテーションがキャッシュにありません。 | |
| lindex の値が無効です。現在サポートされているのは -1 のみです。 | |
| dwAspect の値が無効です。 |
解説(Remarks)
IViewObject::Freeze メソッドは、後続の IViewObject::Unfreeze の呼び出しによって解放されるまで、ビューオブジェクトに描画された表現を固定させます。IViewObject::Freeze を呼び出した後は、同じパラメーターで IViewObject::Draw を連続して呼び出しても、IViewObject::Unfreeze が呼び出されるまで同じ絵が生成されます。
IViewObject::Freeze はオブジェクトの永続的な状態の一部ではなく、オブジェクトのアンロードおよび再読み込みをまたいで維持されることはありません。
このメソッドの最も一般的な用途はバンド印刷です。
固定状態の間、ビュー通知は送信されません。保留中のビュー通知は、後続の IViewObject::Unfreeze の呼び出しまで延期されます。
IViewObject::Freeze を使用して以前に固定された描画を解放します。このメソッドの最も一般的な用途はバンド印刷です。
| dwFreeze | DWORD | in | どのビューオブジェクトの固定を解除するかを決定する、IViewObject::Freeze から以前に返されたキーを含みます。 |
戻り値
このメソッドは成功時に S_OK を返します。その他の可能な戻り値には以下があります。
| Return code | Description |
|---|---|
| 固定解除の処理中にエラーが発生したか、オブジェクトが現在固定されていません。 |
ビューオブジェクトとアドバイズシンクの間に接続を確立し、アドバイズシンクがオブジェクトのビューの変更について通知を受けられるようにします。
| aspects | DVASPECT | in | アドバイザリ接続を設定する対象のビューです。有効な値は列挙型 DVASPECT から取得します。詳細については DVASPECT 列挙型を参照してください。 | ||||||
| advf | DWORD | in | アドバイザリ接続を制御するためのフラグのグループを含みます。有効な値は列挙型 ADVF から取得します。ただし、このメソッドに関連するのは ADVF 値の一部のみです。次の表では関連する値を簡単に説明します。より詳細な説明については ADVF 列挙型を参照してください。
| ||||||
| pAdvSink | IAdviseSink* | in | 変更を通知されるアドバイザリシンク上の IAdviseSink インターフェイスへのポインターです。NULL 値は既存のアドバイザリ接続を削除します。 |
戻り値
このメソッドは成功時に S_OK を返します。その他の可能な戻り値には以下があります。
| Return code | Description |
|---|---|
| アドバイザリ通知はサポートされていません。 | |
| dwAspect の値が無効です。 | |
| 指定された値の1つ以上が無効です。 | |
| この操作に利用できるメモリが不足しています。 |
解説(Remarks)
ビューオブジェクトに対して描画操作を要求するコンテナーアプリケーションは、IViewObject::SetAdvise メソッドで登録することにより、ビューオブジェクトのプレゼンテーションが変化したときに通知を受けることもできます。オブジェクトの基になるデータがいつ変化するかを知るには、IDataObject::DAdvise を別途呼び出す必要があります。
既存のアドバイザリ接続を削除するには、pAdvSink を NULL に設定して IViewObject::SetAdvise メソッドを呼び出します。
ビューオブジェクトが変化すると、適切なアドバイズシンクの IAdviseSink::OnViewChange メソッドを通じて呼び出しが行われます。
任意の時点で、特定のビューオブジェクトがサポートできるアドバイザリ接続は1つだけです。したがって、IViewObject::SetAdvise が呼び出された時点でビューオブジェクトが既にアドバイズシンクポインターを保持している場合、OLE は新しいポインターが登録される前に既存のポインターを解放します。
直近の IViewObject::SetAdvise 呼び出しで使用された、オブジェクト上のアドバイザリ接続を取得します。
| pAspects | DWORD* | outoptional | 直前の IViewObject::SetAdvise 呼び出しの dwAspect パラメーターが返される場所へのポインターです。このポインターが NULL の場合、呼び出し側はこの値の返却を許可しません。 |
| pAdvf | DWORD* | outoptional | 直前の IViewObject::SetAdvise 呼び出しの advf パラメーターが返される場所へのポインターです。このポインターが NULL の場合、呼び出し側はこの値の返却を許可しません。 |
| ppAdvSink | IAdviseSink** | out | アドバイズシンクへのインターフェイスポインターを受け取る IAdviseSink ポインター変数のアドレスです。このアドバイズシンクへの接続は、pAdvSink パラメーターを提供する以前の IViewObject::SetAdvise 呼び出しで確立されている必要があります。ppvAdvSink が NULL の場合、確立されたアドバイザリ接続はありません。 |
戻り値
このメソッドは成功時に S_OK を返します。
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 指定が可能。#define global IID_IViewObject "{0000010D-0000-0000-C000-000000000046}" #usecom global IViewObject IID_IViewObject "{}" #comfunc global IViewObject_Draw 3 int,int,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr #comfunc global IViewObject_GetColorSet 4 int,int,sptr,sptr,sptr,sptr #comfunc global IViewObject_Freeze 5 int,int,sptr,sptr #comfunc global IViewObject_Unfreeze 6 int #comfunc global IViewObject_SetAdvise 7 int,int,sptr #comfunc global IViewObject_GetAdvise 8 sptr,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。