Dela via


Programmatisk utskrift

OLE tillhandahöll ett sätt att unikt identifiera beständiga dokument (GetClassFile) och läsa in dem i deras associerade kod (CoCreateInstance, , QueryInterface(IID_IPersistFile)QueryInterface(IID_IPersistStorage), IPersistFile::Loadoch IPersistStorage::Load). För att ytterligare möjliggöra utskrift av dokument, introducerar aktiv dokumentinordning (med en befintlig OLE-design som inte levererades med OLE 2.0 ursprungligen) ett grundläggande standardutskriftsgränssnitt, IPrint, allmänt tillgängligt genom alla objekt som kan läsa in dokumenttypens beständiga tillstånd. Varje vy av ett aktivt dokument kan eventuellt stödja IPrint gränssnittet för att tillhandahålla dessa funktioner.

Gränssnittet IPrint definieras på följande sätt:

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);
    };

Klienter och containrar använder IPrint::Print helt enkelt för att instruera dokumentet att skriva ut sig själv när dokumentet har lästs in, ange flaggor för utskriftskontroll, målenheten, sidorna som ska skrivas ut och ytterligare alternativ. Klienten kan också styra fortsättningen av utskrift via gränssnittet IContinueCallback (se nedan).

Dessutom IPrint::SetInitialPageNum stöder möjligheten att skriva ut en serie dokument som en genom att numrera sidor sömlöst, uppenbarligen en fördel för aktiva dokumentcontainrar som Office Binder. IPrint::GetPageInfo gör det enkelt att visa sidnumreringsinformation genom att låta anroparen hämta startsidans nummer som tidigare skickats till SetInitialPageNum (eller dokumentets interna standardstartsidanummer) och antalet sidor i dokumentet.

Objekt som stöder IPrint markeras i registret med nyckeln "Utskrivbar" lagrad under objektets CLSID:

HKEY_CLASSES_ROOT\CLSID\{...}\Printable

IPrint implementeras vanligtvis på samma objekt som stöder antingen IPersistFile eller IPersistStorage. Anropare noterar möjligheten att programmatiskt skriva ut det beständiga tillståndet för en viss klass genom att leta i registret efter nyckeln "Utskrivbar". För närvarande anger "Utskrivbar" stöd för minst IPrint; andra gränssnitt kan definieras i framtiden som sedan skulle vara tillgängliga via QueryInterface där IPrint helt enkelt representerar basnivån för support.

Under en utskriftsprocedur kanske du vill att klienten eller containern som initierade utskriften ska styra om utskriften ska fortsätta eller inte. Containern kan till exempel ha stöd för kommandot "Stoppa utskrift" som ska avsluta utskriftsjobbet så snart som möjligt. För att stödja den här funktionen kan klienten för ett utskrivbart objekt implementera ett litet meddelandemottagareobjekt med gränssnittet IContinueCallback:

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

Det här gränssnittet är utformat för att vara användbart som en allmän fortsättningsåteranropsfunktion som tar plats i de olika fortsättningsprocedurerna i Win32-API:et (till exempel AbortProc för utskrift och EnumMetafileProc för metafiluppräkning). Därför är den här gränssnittsdesignen användbar i en mängd olika tidskrävande processer.

I de mest allmänna fallen anropas IContinueCallback::FContinue-funktionen regelbundet av vilken som helst lång process. Sink-objektet returnerar S_OK för att fortsätta åtgärden och S_FALSE för att avbryta proceduren så snart som möjligt.

FContinue används inte i kontexten av IPrint::Print, utan istället används IContinueCallback::FContinuePrint. Alla utskriftsobjekt bör regelbundet anropa FContinuePrinting genom att skicka det antal sidor som har skrivits ut, antalet sidor som skrivs ut och ytterligare en sträng som beskriver utskriftsstatusen som klienten kan välja att visa för användaren (till exempel "Sida 5 av 19").

Se även

Aktiva dokumentcontainrar