本主題討論建立預覽處理程式所需的特定介面和方法。
預覽處理程式必須實作下列介面:
- IInitializeWithStream::Initialize(強烈建議使用)、IInitializeWithFile,或 IInitializeWithItem
- IObjectWithSite
- IOleWindow
- IPreviewHandler
如果您的預覽處理程式支援主機提供的視覺設定,例如背景色彩和字型,它也必須實作下列介面:
本主題假設預覽處理程式是以資料流初始化,並已註冊特定檔案名稱副檔名。
IInitializeWithStream::Initialize
儲存 IStream 和模式參數,以便在準備好預覽專案時讀取項目的數據。 請勿在 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::DoPreview
- IPreviewHandler::SetFocus
- IPreviewHandler::QueryFocus
- IPreviewHandler::TranslateAccelerator
- IPreviewHandler::Unload
IPreviewHandler::SetWindow
將此方法的 hwnd 參數設定為預覽處理程式 HWND的父系。 這個方法可以重複呼叫。 調整預覽大小,使其只在 prc 參數所描述的區域呈現。
如果預覽程式正在進行轉譯,請使用 IPreviewHandler::SetWindow 方法來變更預覽程式的父代。 同時變更預覽程序呈現所在的區域。
IPreviewHandler::SetRect
調整預覽大小,使其只會在此方法的 prc所描述的區域呈現。
如果預覽程式正在進行轉譯,請變更預覽程序轉譯的區域。
IPreviewHandler::DoPreview
這是實際工作完成的地方。 因為預覽是動態的,所以只有在需要預覽內容時才會載入。 請勿在初始化中載入內容。
如果預覽處理程式視窗不存在,請加以建立。 預覽處理程式的視窗應該是由 IPreviewHandler::SetWindow所提供的視窗的子視窗。 它們應該是由 IPreviewHandler::SetWindow 和 IPreviewHandler::SetRect 提供的大小(以最近呼叫的函數為準)。
當您有一個視窗後,請從 IStream 載入已初始化預覽處理程式的資料,然後將該資料顯示至預覽處理程式的視窗。
IPreviewHandler::SetFocus
當焦點透過索引卷標動作進入閱讀窗格時,就會呼叫這個方法。 因為它可以作為順向製表或逆向製表來輸入,所以請使用 SHIFT 鍵的當前狀態來決定閱讀窗格中的第一個或最後一個製表位是否應取得焦點。
IPreviewHandler::QueryFocus
此方法應該呼叫 GetFocus 函式,並在 phwnd 參數中傳回該呼叫的結果。
IPreviewHandler::TranslateAccelerator
這個方法由預覽處理程式的程序的訊息循環呼叫,以回應用戶擊鍵,無論是 prevhost.exe 還是自定義本地伺服器。 預覽處理程式應該根據下面詳述的演算法處理這些擊鍵或將它們轉送至主機。
不過,因為預覽是只讀的,因此鍵盤輸入應該最少,而且在許多情況下不需要這樣的優化。
如果透過訊息幫浦傳遞至此方法的鍵盤快捷鍵是預覽處理程式接受的快速鍵,則處理它並傳回S_OK。 如果您的處理程式不接受該加速器,則可以將快捷鍵訊息傳回要處理的框架。
將鍵盤快速鍵轉送回框架有兩個選項:
最簡單的模型是使用 IPreviewHandlerFrame::TranslateAccelerator,將所有擊鍵轉送至主機。 這是在 Windows 軟體開發工具套件 (SDK) 提供的預覽處理程式範例中完成的。 所有低完整性預覽處理程式都必須使用此模型。 如果預覽處理程式未處理快捷鍵,請呼叫 IPreviewHandlerFrame::TranslateAccelerator 並傳回其結果。
另一個模型是使用加速器表作為一種優化方法,以避免跨進程邊界傳送過多的按鍵。
- 在您的預覽處理程式上呼叫 IObjectWithSite::SetSite 時,請透過 IPreviewHandlerFrame::GetWindowContext取得加速器表。 (當您的預覽程式被銷毀時,請務必釋放加速器表的句柄。)
- 如果加速鍵是由您的預覽處理程序處理,請處理它並返回S_OK。
- 如果預覽處理器未處理加速鍵,請使用 IsAccelerator IsAccelerator 比較訊息, 取得的加速鍵表。
- 如果加速器符合該加速器表中的項目,請呼叫 IPreviewHandlerFrame::TranslateAccelerator 並傳回其結果。
- 如果快捷鍵不符合快捷鍵對應表中的任何專案,則傳回 S_FALSE。
IPreviewHandler::Unload
呼叫此方法時,請停止任何渲染,釋放由從數據流讀取數據所配置的任何資源,並釋放 IStream 本身 。
呼叫此方法之後,必須先重新初始化處理程式,才能再嘗試呼叫 IPreviewHandler::DoPreview。
IPreviewHandlerVisuals
- IPreviewHandlerVisuals::SetBackgroundColor
- IPreviewHandlerVisuals::SetFont
- IPreviewHandlerVisuals::SetTextColor
當指示預覽處理程式回應主機的色彩和字型配置時,應該實作這些方法。 主機查詢處理程式 IPreviewHandlerVisuals。 如果確認支援,主機會提供相關的色彩、字型和文字色彩。
IPreviewHandlerVisuals::SetBackgroundColor
儲存此色彩,並在您想要提供背景色彩時在轉譯期間使用它。 例如,當處理程式轉譯為小於 IPreviewHandler::SetWindow 和 IPreviewHandler::SetRect所提供的區域時,填滿視窗。 不過請注意,您不應該在那些方法所提供的區域之外繪製。
如果在預覽已經正在渲染時呼叫這個方法,則應該使用此背景色彩重新啟動渲染。
IPreviewHandlerVisuals::SetFont
儲存此字型資訊,並在轉譯期間使用它,當您想要顯示與目前 Windows Vista 設定一致的文字時。
IPreviewHandlerVisuals::SetTextColor
儲存此文字色彩資訊,並在轉譯期間使用它,當您想要顯示與目前 Windows Vista 設定一致的文字時。
相關主題