Delen via


Programmatisch afdrukken

OLE biedt de middelen om permanente documenten (GetClassFile) uniek te identificeren en ze in de bijbehorende code (CoCreateInstance, QueryInterface(IID_IPersistFile), QueryInterface(IID_IPersistStorage), IPersistFile::Load en IPersistStorage::Load) te laden. Als u documenten verder wilt afdrukken, introduceert actieve documentsluiting (met behulp van een bestaand OLE-ontwerp dat oorspronkelijk niet met OLE 2.0 is verzonden) een basisstandaard afdrukinterface, IPrintdie algemeen beschikbaar is via elk object dat de permanente status van het documenttype kan laden. Elke weergave van een actief document kan eventueel de IPrint interface ondersteunen om deze mogelijkheden te bieden.

De IPrint interface wordt als volgt gedefinieerd:

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 en containers gebruiken IPrint::Print gewoon om het document te instrueren om zichzelf af te drukken zodra het document is geladen, het afdrukken van besturingsvlagmen, het doelapparaat, de pagina's die moeten worden afgedrukt en aanvullende opties. De client kan ook de voortzetting van afdrukken beheren via de interface IContinueCallback (zie hieronder).

Daarnaast IPrint::SetInitialPageNum ondersteunt u de mogelijkheid om een reeks documenten naadloos af te drukken door pagina's te nummeren, uiteraard een voordeel voor actieve documentcontainers zoals Office Binder. IPrint::GetPageInfo maakt het weergeven van pagineringsgegevens eenvoudig door de beller toe te staan het beginpaginanummer op te halen dat eerder is doorgegeven aan SetInitialPageNum (of het interne standaardnummer van de beginpagina) en het aantal pagina's in het document.

Objecten die IPrint ondersteunen, zijn gemarkeerd in het register met de sleutel "Printable", opgeslagen onder de CLSID van het object.

HKEY_CLASSES_ROOT\CLSID\{...}\Printable

IPrint wordt meestal geïmplementeerd op hetzelfde object dat ofwel IPersistFile of IPersistStorage ondersteunt. Aanroepers noteren de mogelijkheid om via programmatuur de blijvende toestand van een bepaalde klasse af te drukken door in het register te zoeken naar de 'Afdrukbaar' sleutel. Op dit moment geeft 'Printable' ondersteuning aan voor ten minste IPrint; andere interfaces kunnen in de toekomst worden gedefinieerd, die vervolgens beschikbaar zouden zijn via QueryInterface waar IPrint eenvoudigweg het basisniveau van de ondersteuning wordt aangegeven.

Tijdens een afdrukproces wilt u mogelijk dat de client of container die het afdrukken heeft gestart, controle heeft over of het afdrukken moet doorgaan of niet. De container kan bijvoorbeeld een opdracht 'Afdrukken stoppen' ondersteunen waarmee de afdruktaak zo snel mogelijk wordt beëindigd. Ter ondersteuning van deze mogelijkheid kan de client van een afdrukbaar object een klein object voor de meldingssink implementeren met de interface IContinueCallback:

interface IContinueCallback : IUnknown
    {
    HRESULT FContinue(void);
    HRESULT FContinuePrinting(
        [in] LONG cPagesPrinted,
        [in] LONG nCurrentPage,
        [in] LPOLESTR pszPrintStatus);
    };

Deze interface is ontworpen om nuttig te zijn als een algemene callback-functie die de plaats vindt van de verschillende vervolgprocedures in de Win32-API (zoals het AbortProc voor afdrukken en de opsomming van metabestanden EnumMetafileProc ). Dit interfaceontwerp is dus nuttig in een groot aantal tijdrovende processen.

In de meeste algemene gevallen wordt de IContinueCallback::FContinue functie periodiek aangeroepen door een langdurig proces. Het sinkobject retourneert S_OK om de bewerking voort te zetten en S_FALSE de procedure zo snel mogelijk te stoppen.

FContinue wordt echter niet gebruikt in de context van IPrint::Print; in plaats daarvan gebruikt afdrukken IContinueCallback::FContinuePrint. Elk afdrukobject moet periodiek FContinuePrinting aanroepen en daarbij het aantal pagina's dat wordt afgedrukt, het nummer van de pagina die momenteel wordt afgedrukt, en een extra tekenreeks die de afdrukstatus beschrijft die de clientapplicatie aan de gebruiker kan tonen (zoals "Pagina 5 van 19") doorgeven.

Zie ook

Actieve documentcontainers