Condividi tramite


Stampa a livello di codice

OLE ha fornito i mezzi per identificare in modo univoco i documenti persistenti (GetClassFile) e caricarli nel codice associato (CoCreateInstance, QueryInterface(IID_IPersistFile), QueryInterface(IID_IPersistStorage)IPersistFile::Load, e IPersistStorage::Load). Per abilitare ulteriormente la stampa dei documenti, il contenimento di documenti attivi (utilizzando una progettazione OLE esistente non fornita con OLE 2.0 in origine) introduce un'interfaccia di stampa standard di base, , IPrintdisponibile a livello generale tramite qualsiasi oggetto in grado di caricare lo stato permanente del tipo di documento. Ogni visualizzazione di un documento attivo può facoltativamente supportare l'interfaccia IPrint per fornire queste funzionalità.

L'interfaccia IPrint è definita come segue:

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

I client e i contenitori usano IPrint::Print semplicemente per indicare al documento di stamparsi una volta caricato il documento, specificando i flag di controllo di stampa, il dispositivo di destinazione, le pagine da stampare e altre opzioni. Il client può anche controllare la continuazione della stampa tramite l'interfaccia IContinueCallback (vedere di seguito).

Inoltre, IPrint::SetInitialPageNum supporta la possibilità di stampare una serie di documenti come una numerando facilmente le pagine, ovviamente un vantaggio per i contenitori di documenti attivi come Office Binder. IPrint::GetPageInfo rende semplice la visualizzazione delle informazioni di paginazione consentendo al chiamante di recuperare il numero di pagina iniziale passato SetInitialPageNum in precedenza (o il numero di pagina iniziale predefinito interno del documento) e il numero di pagine nel documento.

Gli oggetti che supportano IPrint sono contrassegnati nel Registro di sistema con la chiave "Stampabile" archiviata nel CLSID dell'oggetto:

HKEY_CLASedizione StandardS_ROOT\CLSID\{...} \Stampabile

IPrint viene in genere implementato nello stesso oggetto che supporta IPersistFile o IPersistStorage. I chiamanti notano la funzionalità per stampare a livello di codice lo stato permanente di una classe cercando nel Registro di sistema la chiave "Stampabile". Attualmente, "Stampabile" indica il supporto per almeno IPrint; altre interfacce possono essere definite in futuro, che sarebbero quindi disponibili tramite QueryInterface dove IPrint semplicemente rappresenta il livello di base di supporto.

Durante una procedura di stampa, è possibile che il client o il contenitore che ha avviato la stampa per controllare se la stampa deve continuare o meno. Ad esempio, il contenitore può supportare un comando "Interrompi stampa" che deve terminare il processo di stampa il prima possibile. Per supportare questa funzionalità, il client di un oggetto stampabile può implementare un piccolo oggetto sink di notifica con l'interfaccia IContinueCallback:

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

Questa interfaccia è progettata per essere utile come funzione di callback di continuazione generica che prende il posto delle varie procedure di continuazione nell'API Win32 , ad esempio per la AbortProc stampa e l'enumerazione EnumMetafileProc del metafile. Pertanto, questa progettazione di interfaccia è utile in un'ampia gamma di processi dispendiosi in termini di tempo.

Nei casi più generici, la IContinueCallback::FContinue funzione viene chiamata periodicamente da qualsiasi processo lungo. L'oggetto sink restituisce S_OK per continuare l'operazione e S_FALedizione Standard arrestare la routine il prima possibile.

FContinue, tuttavia, non viene utilizzato nel contesto di IPrint::Print; invece, la stampa usa IContinueCallback::FContinuePrint. Qualsiasi oggetto di stampa deve chiamare FContinuePrinting periodicamente passando il numero di pagine che sono state stampate, il numero della pagina stampata e una stringa aggiuntiva che descrive lo stato di stampa che il client può scegliere di visualizzare all'utente (ad esempio "Pagina 5 di 19").

Vedi anche

Contenitori documenti attivi