Udostępnij za pośrednictwem


Drukowanie programowe

Obiekt OLE dostarczył metodę unikatowego identyfikowania trwałych dokumentów (GetClassFile) i załadowania ich do skojarzonego kodu (CoCreateInstance, QueryInterface(IID_IPersistFile), QueryInterface(IID_IPersistStorage), IPersistFile::Loadi IPersistStorage::Load). Aby jeszcze bardziej umożliwić drukowanie dokumentów, aktywne zawieranie dokumentów (przy użyciu istniejącego projektu OLE, który nie jest dostarczany z ole 2.0 pierwotnie) wprowadza podstawowy standardowy interfejs drukowania, IPrint, ogólnie dostępny za pośrednictwem dowolnego obiektu, który może załadować trwały stan typu dokumentu. Każdy widok aktywnego dokumentu może opcjonalnie obsługiwać interfejs, IPrint aby zapewnić te możliwości.

Interfejs IPrint jest definiowany w następujący sposób:

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

Klienci i kontenery po prostu używają IPrint::Print polecenia, aby dokument wydrukował się po załadowaniu tego dokumentu, określając flagi kontrolek drukowania, urządzenie docelowe, strony do drukowania i dodatkowe opcje. Klient może również kontrolować kontynuację drukowania za pośrednictwem interfejsu IContinueCallback (patrz poniżej).

Ponadto IPrint::SetInitialPageNum obsługuje możliwość drukowania serii dokumentów jako jednej przez bezproblemowe numerowanie stron, oczywiście korzyść dla aktywnych kontenerów dokumentów, takich jak Office Binder. IPrint::GetPageInfo sprawia, że wyświetlanie informacji o stronicowaniu jest proste, umożliwiając wywołującym pobranie wcześniej przekazanego SetInitialPageNum numeru strony początkowej (lub wewnętrznego domyślnego numeru strony początkowej dokumentu) oraz liczbę stron w dokumencie.

Obiekty, które obsługują IPrint , są oznaczone w rejestrze za pomocą klucza "Printable" przechowywanego w identyfikatorze CLSID obiektu:

HKEY_CLASSES_ROOT\CLSID\{...} \Drukowania

IPrint jest zwykle implementowany na tym samym obiekcie, który obsługuje element IPersistFile lub IPersistStorage. Osoby wywołujące zanotują możliwość programowego drukowania trwałego stanu niektórych klas, wyszukując w rejestrze klucz "Printable". Obecnie "Printable" wskazuje obsługę co najmniej IPrint; inne interfejsy mogą być zdefiniowane w przyszłości, które następnie będą dostępne za pośrednictwem QueryInterface miejsca, w którym IPrint po prostu reprezentuje podstawowy poziom obsługi.

Podczas procedury drukowania można chcieć, aby klient lub kontener, który zainicjował drukowanie, aby kontrolować, czy drukowanie powinno być kontynuowane. Na przykład kontener może obsługiwać polecenie "Zatrzymaj drukowanie", które powinno zakończyć zadanie drukowania tak szybko, jak to możliwe. Aby obsługiwać tę funkcję, klient obiektu drukowalnego może zaimplementować mały obiekt ujścia powiadomień za pomocą interfejsu IContinueCallback:

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

Ten interfejs został zaprojektowany tak, aby był przydatny jako ogólna funkcja wywołania zwrotnego kontynuacji, która ma miejsce w różnych procedurach kontynuacji w interfejsie API Win32 (na przykład AbortProc do drukowania i EnumMetafileProc wyliczania metapliku). W związku z tym ten projekt interfejsu jest przydatny w wielu różnych czasochłonnych procesach.

W większości przypadków IContinueCallback::FContinue ogólnych funkcja jest wywoływana okresowo przez dowolny długi proces. Obiekt ujścia zwraca S_OK, aby kontynuować operację, a S_FALSE zatrzymać procedurę tak szybko, jak to możliwe.

FContinuejednak nie jest używany w kontekście IPrint::Printprogramu ; natomiast drukowanie używa metody IContinueCallback::FContinuePrint. Każdy obiekt drukowania powinien okresowo wywoływać FContinuePrinting przekazywanie liczby stron, które zostały wydrukowane, numer strony drukowanej oraz dodatkowy ciąg opisujący stan drukowania, który klient może wybrać do wyświetlenia użytkownikowi (na przykład "Strona 5 z 19").

Zobacz też

Kontenery dokumentów aktywnych