以程式設計方式列印
OLE 所提供的方法,可唯一識別持續的文件 (GetClassFile) 然後將它們載入其相關聯的程式碼 (CoCreateInstance, QueryInterface(IID_IPersistFile), QueryInterface(IID_IPersistStorage), IPersistFile::Load,以及 IPersistStorage::Load)。若要進一步讓列印的文件,使用中的文件內含項目 (使用現存的 OLE 設計未隨附於 OLE 2.0 原本) 介紹基底標準列印的介面, IPrint,通常可以透過任何可以載入持續性狀態的文件類型的物件。主動式文件的每個檢視可以選擇性地支援 IPrint 介面來提供這些功能。
IPrint介面定義如下:
interface IPrint : IUnknown
{
HRESULT SetInitialPageNum([in] LONG nFirstPage);
HRESULT GetPageInfo(
[out] LONG *pnFirstPage,
[out] LONG *pcPages);
HRESULT Print(
[in] DWORD grfFlags,
[in,out] DVTARGETDEVICE **pptd,
[in,out] PAGESET ** ppPageSet,
[in,out] STGMEDIUM **ppstgmOptions,
[in] IContinueCallback* pCallback,
[in] LONG nFirstPage,
[out] LONG *pcPagesPrinted,
[out] LONG *pnPageLast);
};
用戶端和容器只使用 IPrint::Print 來指示文件一旦載入該文件時,指定列印控制項旗標、 目標裝置、 要列印的頁面列印本身和其他選項。用戶端也可以控制列印透過介面的其中之一IContinueCallback (如下所示)。
此外, IPrint::SetInitialPageNum 支援的功能,如第一個,方法是編號頁可以緊密很明顯地非常益於主動式文件容器,例如 Office 文件夾列印一系列的文件。IPrint::GetPageInfo 會顯示簡單的重新編頁資訊,藉由允許呼叫端来擷取的起始頁碼先前傳遞至 SetInitialPageNum (或文件的起始頁碼的內部預設值) 與文件中的頁數。
物件支援IPrint會以 「 Printable 」 機碼儲存為物件的 CLSID 標記在登錄中:
HKEY_CLASSES_ROOT\CLSID\ {…}\Printable
IPrint通常都會實作相同的物件,其中一個支援IPersistFile或IPersistStorage。呼叫者附註為 「 Printable 」 機碼登錄中尋找,以程式設計的方式列印某個類別中的持續性狀態的能力。目前,「 可列印 」 指示支援至少IPrint。 其他介面定義以後這之後會透過QueryInterface , IPrint 只表示的支援之基底層級。
在列印的程序中,您可以在用戶端或啟始來控制要繼續列印,列印的容器。比方說,容器可支援 「 停止列印 」 的命令,儘快終止列印工作。若要支援這項功能,可列印的物件的用戶端可以實作小通知槽物件與介面IContinueCallback:
interface IContinueCallback : IUnknown
{
HRESULT FContinue(void);
HRESULT FContinuePrinting(
[in] LONG cPagesPrinted,
[in] LONG nCurrentPage,
[in] LPOLESTR pszPrintStatus);
};
這個介面設計,才能作為泛型接續回呼函式就會發生的各種 「 接續 」 程序,在 Win32 API 中 (例如 AbortProc 進行列印, EnumMetafileProc 中繼檔的列舉型別的)。因此這個介面的設計是在各式各樣的費時處理很有用。
在最普通的情況下, IContinueCallback::FContinue 定期冗長的程序所呼叫函式。接收物件會傳回S_OK繼續作業,以及 S_FALSE 停止程序,包括 [越快越好。
FContinue,不過,未使用的內容中 IPrint::Print。 相反地,列印使用 IContinueCallback::FContinuePrint。任何列印物件應該定期地呼叫 FContinuePrinting 傳遞的頁數已經列印,列印、 頁面和其他的字串,描述用戶端可能會想要顯示給使用者 (例如 「 第 5 頁為 19") 之列印狀態的數目。