Programmgesteuertes Drucken
OLE hat die Mittel bereitgestellt, um persistente Dokumente (GetClassFile
) eindeutig zu identifizieren und in ihren zugeordneten Code (CoCreateInstance
, QueryInterface(IID_IPersistFile)
, , QueryInterface(IID_IPersistStorage)
und IPersistFile::Load
IPersistStorage::Load
) zu laden. Um das Drucken von Dokumenten weiter zu ermöglichen, führt die aktive Dokumenteindämmung (mit einem vorhandenen OLE-Design, das ursprünglich nicht mit OLE 2.0 ausgeliefert wurde) eine Basisstandarddruckschnittstelle ein, die allgemein über jedes Objekt verfügbar ist, IPrint
das den permanenten Zustand des Dokumenttyps laden kann. Jede Ansicht eines aktiven Dokuments kann optional die IPrint
Schnittstelle unterstützen, um diese Funktionen bereitzustellen.
Die IPrint
Schnittstelle ist wie folgt definiert:
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);
};
Clients und Container verwenden IPrint::Print
sie einfach, um das Dokument anzuweisen, sich selbst zu drucken, sobald dieses Dokument geladen wurde, und geben Sie Drucksteuerungskennzeichnungen, das Zielgerät, die zu druckbaren Seiten und zusätzliche Optionen an. Der Client kann auch die Fortsetzung des Druckens über die Schnittstelle IContinueCallback
steuern (siehe unten).
Darüber hinaus unterstützt die Möglichkeit, IPrint::SetInitialPageNum
eine Reihe von Dokumenten als eine Reihe von Dokumenten zu drucken, indem Seiten nahtlos nummeriert werden, offensichtlich ein Vorteil für aktive Dokumentcontainer wie Office Binder. IPrint::GetPageInfo
Vereinfacht die Anzeige von Paginierungsinformationen, indem der Aufrufer die zuvor übergebene SetInitialPageNum
Startseitennummer (oder die interne Standardanfangsseitennummer des Dokuments) und die Anzahl der Seiten im Dokument abrufen kann.
Objekte, die IPrint
in der Registrierung mit dem unter der CLSID des Objekts gespeicherten Schlüssel "Printable" gekennzeichnet sind:
HKEY_CLASSES_ROOT\CLSID\{...} \Druckbare
IPrint
wird in der Regel für dasselbe Objekt implementiert, das entweder IPersistFile
oder IPersistStorage
. Aufrufer notieren die Funktion, den persistenten Zustand einer Klasse programmgesteuert zu drucken, indem sie in der Registrierung nach dem Schlüssel "Druckbar" suchen. Derzeit gibt "Druckbar" die Unterstützung für mindestens IPrint
an; andere Schnittstellen können in Der Zukunft definiert werden, die dann verfügbar wären, indem QueryInterface
IPrint
sie einfach die Basisunterstützung darstellt.
Während einer Druckprozedur möchten Sie möglicherweise, dass der Client oder Container, der den Druck initiiert hat, steuern soll, ob der Druck fortgesetzt werden soll. Beispielsweise kann der Container einen Befehl "Drucken beenden" unterstützen, der den Druckauftrag so schnell wie möglich beenden soll. Zur Unterstützung dieser Funktion kann der Client eines druckbaren Objekts ein kleines Benachrichtigungssenkenobjekt mit der Schnittstelle IContinueCallback
implementieren:
interface IContinueCallback : IUnknown
{
HRESULT FContinue(void);
HRESULT FContinuePrinting(
[in] LONG cPagesPrinted,
[in] LONG nCurrentPage,
[in] LPOLESTR pszPrintStatus);
};
Diese Schnittstelle ist so konzipiert, dass sie als generische Fortsetzungsrückruffunktion nützlich ist, die die verschiedenen Fortsetzungsprozeduren in der Win32-API (z AbortProc
. B. zum Drucken und für die EnumMetafileProc
Metadateiaufzählung) übernimmt. Daher ist dieses Schnittstellendesign in einer Vielzahl zeitaufwändiger Prozesse nützlich.
In den generischsten Fällen wird die IContinueCallback::FContinue
Funktion in regelmäßigen Abständen durch einen langen Prozess aufgerufen. Das Sinkobjekt gibt S_OK zurück, um den Vorgang fortzusetzen, und S_FALSE, die Prozedur so schnell wie möglich zu beenden.
FContinue
wird jedoch nicht im Kontext von IPrint::Print
; verwendet, sondern druckt IContinueCallback::FContinuePrint
. Jedes Druckobjekt sollte in regelmäßigen Abständen die Anzahl der zu druckbaren Seiten, die Anzahl der gedruckten Seiten und eine zusätzliche Zeichenfolge aufrufen FContinuePrinting
, die den Druckstatus beschreibt, den der Client dem Benutzer anzeigen kann (z. B. "Seite 5 von 19").