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::LoadIPersistStorage::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, IPrintdas 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 IPrintan; andere Schnittstellen können in Der Zukunft definiert werden, die dann verfügbar wären, indem QueryInterfaceIPrint 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 IContinueCallbackimplementieren:

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.

FContinuewird 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").

Siehe auch

Aktive Dokumente-Container