Udostępnij przez


Drukowanie programowe

OLE zapewniło środki do unikatowego identyfikowania persistentnych dokumentów (GetClassFile) i załadowania ich do ich powiązanego kodu (CoCreateInstance, QueryInterface(IID_IPersistFile), QueryInterface(IID_IPersistStorage), IPersistFile::Load, IPersistStorage::Load). Aby jeszcze bardziej umożliwić drukowanie dokumentów, aktywne zawieranie dokumentów (przy użyciu istniejącego projektu OLE, który nie był pierwotnie dostarczany z OLE 2.0) wprowadza podstawowy, standardowy interfejs drukowania, IPrint, ogólnie dostępny za pośrednictwem dowolnego obiektu, który może załadować trwały stan danego 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, aby dokument wydrukował się po załadowaniu, określając flagi sterowania drukowaniem, docelowe urządzenie, 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 kluczem "Printable" przechowywanym pod identyfikatorem CLSID obiektu:

HKEY_CLASSES_ROOT\CLSID\{...}\Printable

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

Podczas procedury drukowania można chcieć, aby klient lub kontener, który zainicjował drukowanie, 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 zastępuje różne procedury dalszego ciągu w interfejsie API Win32 (na przykład AbortProc do drukowania i EnumMetafileProc do wyliczania metaplików). W związku z tym ten projekt interfejsu jest przydatny w wielu różnych czasochłonnych procesach.

W ogólnych przypadkach funkcja IContinueCallback::FContinue jest wywoływana okresowo przez dowolny proces trwający długo. Obiekt odbiorczy zwraca S_OK, aby kontynuować operację, a S_FALSE, aby zatrzymać procedurę tak szybko, jak to możliwe.

FContinue, jednak nie jest używany w kontekście IPrint::Print, natomiast drukowanie używa 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 także

Aktywne kontenery dokumentów