主動式文件
主動式文件擴充 OLE 的複合文件技術。 這些擴充功能物件可以在容器內作用,卻仍然保有對顯示和列印功能的控制項,以便管理檢視表的其他介面的形式提供。 這項程序可讓您可以在外部索引的畫面格 (例如,Microsoft Office 繫結器或 Microsoft Internet Explorer) 和 (例如產品自己的檢視連接埠) 的原生框架中顯示的文件。
本章節將說明功能需求主動式文件的。 使用中文件擁有一組資料,且能夠存取存放裝置可以儲存和擷取資料。 它可建立及管理其資料的一或多個檢視。 除了支援的一般嵌入和就地啟動的 OLE 文件的介面,在使用中文件通訊能夠建立檢視表,透過IOleDocument。 經由此介面,容器可以要求建立 (並且可能是列舉),可以顯示使用中文件的檢視。 經由此介面,主動式文件也可以提供其他資訊,例如它是否支援多個檢視或複合矩形。
下面是 IOleDocument 介面。 請注意, IEnumOleDocumentViews 介面是標準的 OLE 列舉值為 IOleDocumentView 1 型別。
interface IOleDocument : IUnknown
{
HRESULT CreateView(
[in] IOleInPlaceSite *pIPSite,
[in] IStream *pstm,
[in] DWORD dwReserved,
[out] IOleDocumentView **ppView);
HRESULT GetDocMiscStatus([out] DWORD *pdwStatus);
HRESULT EnumViews(
[out] IEnumOleDocumentViews **ppEnum,
[out] IOleDocumentView **ppView);
}
每個使用中的文件必須具有與此介面的檢視框架提供者。 如果文件不內嵌式的容器內,使用中的文件伺服程式本身必須提供檢視框架。 然而,當使用中文件內嵌於主動式文件容器,容器提供檢視框架。
主動式文件可以建立一或多個類型的檢視的資料 (例如,正常、 大綱、 稿版面配置,等等)。 檢視執行起來像是篩選器可以透過它看到資料。 即使文件只有一種檢視類型,您可能還要做為支援新視窗功能支援多個檢視 (比方說, 開新視窗上的項目 視窗在 Office 應用程式中的功能表)。
主動式文件的需求
主動式文件,可顯示在使用中的文件容器必須:
使用 OLE 的複合檔案做為它的儲存機制,藉由實作IPersistStorage。
支援的基本嵌入功能 OLE 文件,包括由檔案建立。 這必須介面IPersistFile, IOleObject,以及IDataObject。
支援一或多個檢視,其中每一個都可以就地啟動。 也就是檢視表必須支援的介面IOleDocumentView的介面及IOleInPlaceObject和IOleInPlaceActiveObject (使用容器的 IOleInPlaceSite 和 IOleInPlaceFrame 介面)。
支援標準的使用中文件的介面IOleDocument, IOleCommandTarget,以及IPrint。
知道何時以及如何使用容器端介面在這些需求被隱含的。
檢視物件的需求
主動式文件可以建立一個或多個檢視它的資料。 功能上來說,這些檢視就如同到特定的方法,可顯示資料的連接埠。 如果使用中的文件只支援單一檢視,將使用中文件和此單一檢視可以實作使用單一類別。 IOleDocument::CreateView 傳回同一個物件的IOleDocumentView介面指標。
用來呈現作用中的文件容器內,檢視元件必須支援 IOleInPlaceObject 和 IOleInPlaceActiveObject 除了IOleDocumentView:
interface IOleDocumentView : IUnknown
{
HRESULT SetInPlaceSite([in] IOleInPlaceSite *pIPSite);
HRESULT GetInPlaceSite([out] IOleInPlaceSite **ppIPSite);
HRESULT GetDocument([out] IUnknown **ppunk);
[input_sync] HRESULT SetRect([in] LPRECT prcView);
HRESULT GetRect([in] LPRECT prcView);
[input_sync] HRESULT SetRectComplex(
[in] LPRECT prcView,
[in] LPRECT prcHScroll,
[in] LPRECT prcVScroll,
[in] LPRECT prcSizeBox);
HRESULT Show([in] BOOL fShow);
HRESULT UIActivate([in] BOOL fUIActivate);
HRESULT Open(void);
HRESULT CloseView([in] DWORD dwReserved);
HRESULT SaveViewState([in] IStream *pstm);
HRESULT ApplyViewState([in] IStream *pstm);
HRESULT Clone(
[in] IOleInPlaceSite *pIPSiteNew,
[out] IOleDocumentView **ppViewNew);
}
每個檢視都相關的檢視站台,封裝檢視框架和檢視埠 (HWND 和矩形區域,該視窗中的)。 站台公開這項功能但標準 IOleInPlaceSite 介面。 請注意可以有一個以上檢視埠,在單一 HWND 上。
一般而言,每一種檢視會有不同列印的形式。 因此檢視表和對應的檢視站台應該實作列印介面如果IPrint和IContinueCallback,分別。 檢視框架必須交涉與檢視提供者,透過 IPrint 列印開始時,這樣頁首、 頁尾、 邊界和相關項目可以正確列印。 檢視提供者通知的框架與列印相關的事件,透過IContinueCallback。 如需使用這些介面的詳細資訊,請參閱以程式設計方式列印。
請注意是否使用中的文件只支援單一檢視,則將使用中文件和此單一檢視可以實作使用單一的實體類別。 IOleDocument::CreateView 只會傳回相同的物件IOleDocumentView介面指標。 簡單地說,不須有兩個不同的物件執行個體需要只有一個檢視時。
檢視物件也可以是命令目標。 藉由實作IOleCommandTarget檢視可以接收來自容器的使用者介面中的命令 (例如新增, 開啟, 另存新檔, 列印上檔案功能表 ; and Copy, Paste, Undo on the Edit menu). 如需詳細資訊,請參閱 訊息處理和命令目標。