プレビュー ハンドラーのビルド
このトピックでは、プレビュー ハンドラーを作成するために必要な特定のインターフェイスとメソッドについて説明します。
プレビュー ハンドラーは、次のインターフェイスを実装する必要があります。
- IInitializeWithStream::Initialize (強く推奨)、 IInitializeWithFile、または IInitializeWithItem
- IObjectWithSite
- IOleWindow
- IPreviewHandler
プレビュー ハンドラーが、背景色やフォントなどのホストによって提供されるビジュアル設定をサポートしている場合は、次のインターフェイスも実装する必要があります。
このトピックでは、プレビュー ハンドラーがストリームで初期化され、特定のファイル名拡張子に登録されていることを前提としています。
IInitializeWithStream::Initialize
アイテムをプレビューする準備ができたらアイテムのデータを読み取ることができるように、 IStream パラメーターと mode パラメーターを格納します。 Initialize でデータを読み込まない。 レンダリングする直前に IPreviewHandler::D oPreview にデータを読み込みます。
IObjectWithSite
IObjectWithSite::SetSite
後でアクセスできるように IUnknown ポインターを格納します。
現在 、IPreviewHandlerFrame オブジェクトへの参照がある場合は、それを解放します。 格納されている IUnknown ポインターを使用して、サイト上の QueryInterface を呼び出して、新しい IPreviewHandlerFrame 参照を取得します。
現在アクセラレータ テーブルがある場合は、破棄します。 IPreviewHandlerFrame::GetWindowContext を呼び出して、新しいアクセラレータ テーブルを取得します。 このテーブルを格納します。 これは、フレームがサポートするアクセラレータ キーの一覧としてのみ使用されることに注意してください。 アクセラレータ エントリ内のコマンドは無視されます。
IObjectWithSite::GetSite
サイト ポインターが何であれ、それを返します。
IOleWindow
IOleWindow::ContextSensitiveHelp
このメソッドのE_NOTIMPLを返します。
IOleWindow::GetWindow
プレビュー ハンドラーのウィンドウが現在存在する場合は、そのウィンドウの HWND を返し、S_OKします。 ウィンドウが存在しない場合は、E_FAILを返します。
IPreviewHandler
- IPreviewHandler::SetWindow
- IPreviewHandler::SetRect
- IPreviewHandler::D oPreview
- IPreviewHandler::SetFocus
- IPreviewHandler::QueryFocus
- IPreviewHandler::TranslateAccelerator
- IPreviewHandler::Unload
IPreviewHandler::SetWindow
このメソッドの hwnd パラメーターを、プレビュー ハンドラーの HWND の親に設定します。 このメソッドは複数回呼び出すことができます。 プレビューのサイズを変更して、 prc パラメーターで説明されている領域でのみレンダリングされるようにします。
プレビューアーがレンダリング中の場合は、 IPreviewHandler::SetWindow メソッドを使用してプレビューアーの親を変更します。 また、プレビューアーがレンダリングされる領域も変更します。
IPreviewHandler::SetRect
プレビューのサイズを変更して、このメソッドの prc で説明されている領域にのみレンダリングされるようにします。
プレビューアーがレンダリング中の場合は、プレビューアーがレンダリングされる領域を変更します。
IPreviewHandler::D oPreview
これが実際の作業が行われる場所です。 プレビューは動的であるため、プレビュー コンテンツは必要なときにのみ読み込む必要があります。 初期化でコンテンツを読み込まない。
プレビュー ハンドラー ウィンドウが存在しない場合は、作成します。 プレビュー ハンドラーのウィンドウは、 IPreviewHandler::SetWindow によって提供されるウィンドウの子である必要があります。 これらは、IPreviewHandler::SetWindow と IPreviewHandler::SetRect (最近呼び出された方) によって提供されるサイズである必要があります。
ウィンドウを作成したら、プレビュー ハンドラーが初期化された IStream からデータを読み込み、そのデータをプレビュー ハンドラーのウィンドウにレンダリングします。
IPreviewHandler::SetFocus
このメソッドは、フォーカスがタブ アクションを通じて閲覧ウィンドウに入るときに呼び出されます。 前方タブまたは反転タブとして入力できるため、Shift キーの現在の状態を使用して、閲覧ウィンドウの最初と最後のタブ位置がフォーカスを受け取るかどうかを決定します。
IPreviewHandler::QueryFocus
このメソッドは GetFocus 関数を呼び出し、その呼び出しの結果を phwnd パラメーターで返す必要があります。
IPreviewHandler::TranslateAccelerator
このメソッドは、ユーザーのキーストロークに応じて、プレビュー ハンドラーのプロセス (prevhost.exeまたはカスタム ローカル サーバー) のメッセージ ポンプによって呼び出されます。 プレビュー ハンドラーでは、これらのキーストロークを処理するか、以下で詳しく説明するアルゴリズムに従ってホストに転送する必要があります。
ただし、プレビューは読み取り専用であるため、キーボード入力は最小限に抑える必要があり、このような最適化は多くの場合必要ありません。
メッセージ ポンプを介してこのメソッドに渡されたキーボード アクセラレータが、プレビュー ハンドラーが受け入れるアクセラレータである場合は、それを処理し、S_OK返します。 ハンドラーがそのアクセラレータを受け入れない場合は、処理するフレームまでアクセラレータ メッセージを返送できます。
キーボード アクセラレータをフレームに戻すには、次の 2 つのオプションがあります。
最も簡単なモデルは、 IPreviewHandlerFrame::TranslateAccelerator を使用して、すべてのキーストロークをホストに転送することです。 これは、Windows ソフトウェア開発キット (SDK) で提供されるプレビュー ハンドラー サンプルで行われます。 すべての低整合性プレビュー ハンドラーでは、このモデルを使用する必要があります。 アクセラレータがプレビュー ハンドラーによって処理されない場合は、 IPreviewHandlerFrame::TranslateAccelerator を呼び出し、その結果を返します。
もう 1 つのモデルは、プロセス境界を越えてキーストロークが多くなりすぎないように、アクセラレータ テーブルを最適化として使用することです。
- プレビュー ハンドラー で IObjectWithSite::SetSite が呼び出された場合は、 IPreviewHandlerFrame::GetWindowContext を使用してアクセラレータ テーブルを取得します。 (プレビューアーが破棄された場合は、必ずアクセラレータ テーブルへのハンドルを解放してください)。
- アクセラレータがプレビュー ハンドラーによって処理される場合は、それを処理し、S_OK返します。
- アクセラレータがプレビュー ハンドラーによって処理されない場合は、 IsAccelerator を使用してメッセージを取得したアクセラレータ テーブルと比較します。
- アクセラレータがそのアクセラレータ テーブルのエントリと一致する場合は、 IPreviewHandlerFrame::TranslateAccelerator を呼び出し、その結果を返します。
- アクセラレータがアクセラレータ テーブルのどのエントリにも一致しない場合は、S_FALSEを返します。
IPreviewHandler::Unload
このメソッドが呼び出されたら、レンダリングを停止し、ストリームからデータを読み取って割り当てられたリソースを解放し、 IStream 自体を解放します。
このメソッドが呼び出されたら、 IPreviewHandler::D oPreview を再度呼び出す前に、ハンドラーを再初期化する必要があります。
IPreviewHandlerVisuals
- IPreviewHandlerVisuals::SetBackgroundColor
- IPreviewHandlerVisuals::SetFont
- IPreviewHandlerVisuals::SetTextColor
これらのメソッドは、ホストの色とフォント パターンに応答するようにプレビュー ハンドラーに指示するときに実装する必要があります。 ホストは、 IPreviewHandlerVisuals のハンドラーに対してクエリを実行します。 サポートされていることがわかった場合、ホストは色、フォント、テキストの色を提供します。
IPreviewHandlerVisuals::SetBackgroundColor
この色を保存し、背景色を指定する場合はレンダリング中に使用します。 たとえば、ハンドラーが IPreviewHandler::SetWindow および IPreviewHandler::SetRect によって提供される領域より小さい領域にレンダリングされるときにウィンドウを塗りつぶします。 ただし、これらのメソッドによって提供される領域の外側に描画しないでください。
プレビューのレンダリング中にこのメソッドを呼び出す場合は、この背景色を使用してレンダリングを再開する必要があります。
IPreviewHandlerVisuals::SetFont
このフォント情報を保存し、現在の Windows Vista 設定と一致するテキストを表示する場合は、レンダリング中に使用します。
IPreviewHandlerVisuals::SetTextColor
このテキストの色情報を保存し、現在の Windows Vista の設定と一致するテキストを表示する場合は、レンダリング中に使用します。
関連トピック