IPreviewHandler
COM公式ドキュメント
リッチプレビューを表示するためのメソッドを公開します。
解説(Remarks)
プレビューハンドラーはマネージドコードで作成できます。通常、すべてのプレビューハンドラーは prevhost.exe と呼ばれるサロゲートプロセス内でまとめてホストされます。このプロセスには、通常の整合性レベルで実行されるプレビューハンドラー用のインスタンスと、低整合性レベルで実行されるプレビューハンドラー用のインスタンスの 2 つがあります。ハンドラーをマネージドコードで実装する場合、そのハンドラーはこれら共有プロセスのいずれの内部でも実行すべきではありません。代わりに、レジストリに新しい AppID エントリを作成し(DllSurrogate 値として prevhost.exe を指定)、それをハンドラーのクラス ID のレジストリ値内の AppID 値として設定することで、ハンドラーが prevhost.exe の新しいインスタンスを取得するようにしてください。これにより、他のハンドラーが使用する共通インスタンスではなく、ハンドラー専用の一意の prevhost.exe インスタンスが作成されます。
メソッド 7
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
プレビューウィンドウの親ウィンドウ、および親ウィンドウ内でプレビューウィンドウに使用する領域を設定します。
| hwnd | HWND | in | 親ウィンドウへのハンドル。 |
| prc | RECT* | in | プレビューに使用する領域を定義する RECT へのポインター。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
プレビューハンドラーは、prc で定義された領域全体の描画を担当します。プレビューウィンドウが既に作成されている場合、プレビューハンドラーはそのプレビューウィンドウを新しい親 hwnd に関連付け、prc で定義された領域にサイズ変更する必要があります。プレビューウィンドウがまだ作成されていない場合、プレビューハンドラーは、IPreviewHandler::DoPreview でプレビューウィンドウが作成されるときのためにこの情報を保持しておく必要があります。
親 hwnd 内でプレビューハンドラーが描画する領域を変更するようプレビューハンドラーに指示します。
| prc | RECT* | in | プレビューに使用する RECT へのポインター。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
プレビューハンドラーウィンドウが作成される前に呼び出された場合、新しい RECT は、以前の IPreviewHandler::SetWindow 呼び出しで受け取った RECT を置き換えます。
プレビューハンドラーウィンドウが作成された後に呼び出された場合、プレビューハンドラーウィンドウをサイズ変更する必要があります。
プレビューハンドラーが既にレンダリング中の場合、レンダリング処理を中断せずにプレビューをサイズ変更する必要があります。
以前の Initialize メソッド呼び出しで指定されたソースからデータを読み込み、プレビューウィンドウへのレンダリングを開始するようプレビューハンドラーに指示します。
戻り値
型: HRESULT
このメソッドは次のいずれかの値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| 操作は正常に完了しました。 | |
| デジタル著作権管理によってブロックされました。 | |
| ファイルのアクセス許可によってブロックされました。 | |
| 項目が見つかりませんでした。 | |
| 項目が破損していました。 |
解説(Remarks)
プレビューウィンドウがまだ作成されていない場合、このメソッドが呼び出された後に作成する必要があります。プレビューハンドラーは、IPreviewHandler::SetWindow または IPreviewHandler::SetRect で指定された領域の描画を担当します。これらのメソッドがプレビューハンドラーのレンダリング中に呼び出された場合、項目のレンダリングを停止したり再開したりせずに、ウィンドウの親の変更やサイズ変更を行う必要があります。
このメソッドは、IPreviewHandler::SetWindow が呼び出された後にのみ呼び出す必要があります。
さらに、このメソッドは、IInitializeWithItem::Initialize、IInitializeWithStream::Initialize、または IInitializeWithFile::Initialize が呼び出された後にのみ呼び出す必要があります。
プレビューのレンダリングを停止し、初期化時に渡された項目に基づいて割り当てられたすべてのリソースを解放するようプレビューハンドラーに指示します。
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
呼び出されると、プレビューウィンドウが破棄されます。
このメソッドは、IInitializeWithItem::Initialize、IInitializeWithStream::Initialize、または IInitializeWithFile::Initialize が呼び出された後にのみ呼び出す必要があります。この初期化に関連付けられたすべてのリソースが解放されます。IPreviewHandler::DoPreview を呼び出す前に、このプレビューハンドラーは、いずれかの初期化インターフェイスの呼び出しと IPreviewHandler::SetWindow の呼び出しによって再初期化されます。
プレビューハンドラーに、自身にフォーカスを設定するよう指示します。
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
このメソッドは、最初のタブストップにフォーカスを設定するか、最後のタブストップにフォーカスを設定するかを決定するために、SHIFT キーの状態を照会する必要があります。これは、IPreviewHandler::SetFocus が、呼び出し元スレッドによって作成されたウィンドウにフォーカスが設定される場合にのみ成功できるために必要です。
これは、ホストからプレビューハンドラーへ渡されるアクセラレータキーの範囲のすべてであり、他のアクセラレータは渡されません。IPreviewHandler::TranslateAccelerator は、プレビューハンドラーのメッセージポンプから IPreviewHandler オブジェクトへのメッセージにのみ使用されます。
GetFocus 関数の呼び出しから得られる HWND を返すようプレビューハンドラーに指示します。
| phwnd | HWND* | out | このメソッドが返るとき、プレビューハンドラーのフォアグラウンドスレッドから GetFocus 関数を呼び出して返された HWND へのポインターが格納されます。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
このメソッドは、GetFocus 関数が、呼び出し元スレッドによって作成されたウィンドウにフォーカスがある場合にのみ成功できるために必要です。このメソッドは、タブ順序を管理し、プレビューハンドラーのウィンドウへのタブ移動およびウィンドウからのタブ移動をサポートするためにホストによって使用されます。
プレビューハンドラーが実行されているプロセスのメッセージポンプから渡されたキーストロークを処理するようプレビューハンドラーに指示します。
| pmsg | MSG* | in | ウィンドウメッセージへのポインター。 |
戻り値
型: HRESULT
キーストロークメッセージがプレビューハンドラーによって処理できる場合、ハンドラーはそれを処理して S_OK を返します。プレビューハンドラーがキーストロークメッセージを処理できない場合、TranslateAccelerator を使用してホストに提供します。ホストがメッセージを処理した場合、このメソッドは S_OK を返します。ホストがメッセージを処理しない場合、このメソッドは S_FALSE を返します。
解説(Remarks)
この関数は、プレビューハンドラーが実行されているプロセスのメッセージポンプからのみ呼び出されます。この関数により、TranslateAccelerator を使用して、メッセージポンプからホストへキーストロークメッセージを転送できます。
プレビューハンドラーは、そのメッセージポンプからメッセージ(キーストローク)を受け取ると、それをホストへ転送する責任があります。
プレビューハンドラーに対して IObjectWithSite::SetSite が呼び出されると、プレビューハンドラーのホストへの参照が渡されます。オブジェクトは直ちにそのサイトに対して IPreviewHandlerFrame を QueryInterface し、そのポインターを格納する必要があります。
その後、プレビューハンドラーは、キーストロークをフィルタリングするためのアクセラレータテーブルを取得するために GetWindowContext を呼び出すオプションがあります。その後、プレビューは IsAccelerator を使用してキーストロークをそのアクセラレータテーブルと比較し、一致するキーストロークについてのみ IPreviewHandler::TranslateAccelerator を呼び出すことができます。これにより、パフォーマンスがわずかに向上する場合があります。プレビューハンドラーは、DestroyAcceleratorTable 関数を使用してアクセラレータテーブルを解放する必要があります。
プレビューハンドラーがテーブルをまったく使用せず、すべてのキーストロークに対して IPreviewHandler::TranslateAccelerator を呼び出すことも許容されます。低整合性プロセスで実行されるすべてのプレビューハンドラーは、この方法を使用する必要があることに注意してください。
タブキーが押されたとき、プレビューハンドラーに複数のタブストップがある場合、それらのタブストップ内でキーボードフォーカスを移動させる責任があります。現在のキーボードフォーカスがこれらのタブストップの 1 つにあり、キーボードフォーカスを進めると別のプレビューアのタブストップに移動する場合、プレビューアは次のタブストップに対して SetFocus を呼び出す必要があります。それ以外の場合、タブキーはホストに転送され、プレビューアからのタブ移動を処理させる必要があります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IPreviewHandler "{8895B1C6-B41F-4C1C-A562-0D564250836F}" #usecom global IPreviewHandler IID_IPreviewHandler "{}" #comfunc global IPreviewHandler_SetWindow 3 sptr,var #comfunc global IPreviewHandler_SetRect 4 var #comfunc global IPreviewHandler_DoPreview 5 #comfunc global IPreviewHandler_Unload 6 #comfunc global IPreviewHandler_SetFocus 7 #comfunc global IPreviewHandler_QueryFocus 8 sptr #comfunc global IPreviewHandler_TranslateAccelerator 9 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IPreviewHandler "{8895B1C6-B41F-4C1C-A562-0D564250836F}" #usecom global IPreviewHandler IID_IPreviewHandler "{}" #comfunc global IPreviewHandler_SetWindow 3 sptr,sptr #comfunc global IPreviewHandler_SetRect 4 sptr #comfunc global IPreviewHandler_DoPreview 5 #comfunc global IPreviewHandler_Unload 6 #comfunc global IPreviewHandler_SetFocus 7 #comfunc global IPreviewHandler_QueryFocus 8 sptr #comfunc global IPreviewHandler_TranslateAccelerator 9 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。