Dokumenty wielostronicowe
W tym artykule opisano protokół drukowania Windows i wyjaśniono, jak drukować dokumenty, które zawierają więcej niż jedną stronę.Artykuł obejmuje następujące tematy:
Protokół drukowania
Widok klasy funkcje nadrzędne
Podział na strony
Vs stron drukarki.stron dokumentu
Czas drukowania podział na strony
Protokół drukowania
Aby wydrukować wielostronicowy dokument, ramy i widok współdziałać w następujący sposób.Najpierw Wyświetla ramach wydruku okno dialogowe tworzy kontekstu urządzenia drukarki i połączenia StartDoc Członkowskich funkcji CDC obiektu.Następnie dla każdej strony dokumentu ramach wywoła blog funkcji Członkowskich CDC obiektów, nakazuje obiektu widoku drukować strony i wywołania EndPage funkcji składowej.Jeśli przed uruchomieniem określonej strony, należy zmienić tryb drukarki, widok wywołuje ResetDC, które aktualizacje DEVMODE struktury zawierające nowe informacje o trybie drukarki.Gdy został wydrukowany cały dokument, wywołuje ramach EndDoc funkcji składowej.
Widok klasy funkcje nadrzędne
CView klasy definiuje kilka funkcji elementów członkowskich, które są wywoływane w ramach podczas drukowania.Przesłanianie tych funkcji w klasie widoku, zapewnia połączenia między ramy drukowania logikę i logiki drukowania klasy widoku.Poniższa tabela zawiera listę tych funkcji elementów członkowskich.
CView's wykonać funkcje drukowania
Nazwa |
Powód nadrzędne |
---|---|
Aby wstawić wartości w oknie dialogowym Drukuj, szczególnie długość dokumentu |
|
Aby przydzielić czcionek lub innych zasobów GDI |
|
Aby dopasować atrybuty kontekstu urządzenia dla danej strony lub do dzielenia czas drukowania |
|
Aby wydrukować strony |
|
Aby cofnąć alokację zasobów GDI |
Przetwarzania dotyczące drukowania w innych funkcji, jak również można zrobić, ale te funkcje są te, które proces drukowania.
Następujący rysunek ilustruje etapy procesu drukowania i wskazuje, gdzie każdy z CViewprzez drukowanie Członkowskich funkcje są wywoływane.Reszty ten artykuł wyjaśnia większość te kroki bardziej szczegółowo.Dodatkowe części procesu drukowania są opisane w artykule Przydzielania zasobów GDI.
Pętla drukowania
Podział na strony
Ramy przechowuje wiele informacji dotyczących zadania drukowania w CPrintInfo struktury.Kilka wartości w CPrintInfo odnoszą się do podziału na strony; wartości te są dostępne, jak pokazano w poniższej tabeli.
Numer strony informacje przechowywane w CPrintInfo
Zmienna członka lub nazwy funkcji |
Odwołanie do numeru strony |
---|---|
GetMinPage/SetMinPage |
Pierwsza strona dokumentu |
GetMaxPage/SetMaxPage |
Ostatnia strona dokumentu |
GetFromPage |
Pierwszej strony do wydrukowania |
GetToPage |
Ostatniej strony do wydrukowania |
m_nCurPage |
Obecnie drukowanej strony |
Start numery stron na 1, to znaczy pierwszej strony jest numerowana 1, 0 nie.Aby uzyskać więcej informacji na temat tych i innych członków CPrintInfo, zobacz Odniesienia MFC.
Na początku procesu drukowania ramach wywołuje widoku OnPreparePrinting Członkowskie, funkcję, przekazując wskaźnik do CPrintInfo struktury.Kreator aplikacji stanowi implementację OnPreparePrinting wywołania DoPreparePrinting, innej funkcji Członkowskich CView.DoPreparePrintingFunkcja, która powoduje wyświetlenie okna dialogowego Drukuj, a następnie tworzy kontekstu urządzenia drukarki.
W tym momencie aplikacja nie wie, ile stron są w dokumencie.Używa domyślnej wartości 1 i 0xFFFF numery pierwszej i ostatniej strony dokumentu.Jeśli wiadomo, ile stron dokumentu ma, należy zastąpić OnPreparePrinting i SetMaxPage dla CPrintInfo struktury przed wysłaniem do DoPreparePrinting.Dzięki temu można określić długość dokumentu.
DoPreparePrintingnastępnie wyświetla okno dialogowe Drukuj.Gdy zwraca, CPrintInfo struktura zawiera wartości określonych przez użytkownika.Jeśli użytkownik chce wydrukować zaznaczony zakres stron, numery pierwszej i ostatniej strony w oknie dialogowym Drukuj można określić on.Ramy pobiera te wartości za pomocą GetFromPage i GetToPage funkcje CPrintInfo.Jeśli użytkownik nie określi zakres stron, wywołuje ramach GetMinPage i GetMaxPage i używa wartości zwracane, aby wydrukować cały dokument.
Dla każdej strony dokumentu ma być drukowany, ramach wymaga dwóch funkcji elementów członkowskich w klasie widoku, OnPrepareDC i OnPrinti przekazuje każdej funkcji dwa parametry: wskaźnik do CDC obiektu i wskaźnik do CPrintInfo struktury.Za każdym razem wywołań w ramach OnPrepareDC i OnPrint, przekazuje ona inną wartość w m_nCurPage członek CPrintInfo struktury.W ten sposób ramach informuje widoku strony, która ma być drukowana.
OnPrepareDC Członkowskich funkcji służy także do wyświetlania na ekranie.Przed dokonaniem rysunku, dokona korekt kontekstu urządzenia.OnPrepareDCSłuży podobną rolę w druku, ale istnieje kilka różnic: pierwszy, CDC obiekt reprezentuje kontekstu urządzenia drukarki zamiast kontekstu urządzenia ekranu, a drugi, CPrintInfo obiektu jest przekazywana jako drugi parametr.(Ten parametr jest NULL po OnPrepareDC jest wywoływana dla ekranu.) Zastąpić OnPrepareDC do zmiany kontekstu urządzenia oparte na stronę, która jest drukowany.Na przykład można przenieść pochodzenia wziernika i obszar przycinania, aby zapewnić, że odpowiedni fragment dokumentu zostanie wydrukowane.
OnPrint Członkowskie wykonuje rzeczywiste drukowanie strony.Artykuł Jak domyślna drukowanie jest wykonywane pokazuje, jak wywołuje ramach OnDraw z kontekstu urządzenia drukarki, aby wykonać wydruk.Dokładniej, wywołania RAM OnPrint z CPrintInfo struktury i kontekstu urządzenia, i OnPrint przekazuje kontekstu urządzenia do OnDraw.Zastąpić OnPrint do wykonywania wszelkich renderowania, które powinno być wykonane tylko podczas drukowania, a nie dla ekranu.Na przykład, aby wydrukować nagłówki lub stopki (zobacz artykuł nagłówków i stopek Aby uzyskać więcej informacji).Następnie wywołać OnDraw z override z OnPrint do drukowania i wspólne dla ekranu zarówno renderowania.
Fakt, że OnDraw jest renderowanie zarówno ekranu, wyświetlania i drukowania oznacza, że aplikacja jest WYSIWYG: "What you see is what you get." Jednakże Załóżmy, że nie są pisania aplikacji WYSIWYG.Na przykład rozważmy tekstu edytor, który używa czcionki pogrubionej do drukowania, ale wyświetla kody sterujące, aby wskazać pogrubienie tekstu na ekranie.W takiej sytuacji za pomocą OnDraw do ściśle wyświetlania na ekranie.Kiedy zastąpić OnPrint, zastąpić wywołanie OnDraw z oddzielnych funkcja rysunku.Ta funkcja zwraca dokument sposób wyświetlania na papierze, przy użyciu atrybutów, które nie będą wyświetlane na ekranie.
Vs stron drukarki.Stron dokumentu
Gdy odwołujesz się do numerów stron, czasami konieczne jest odróżnienie koncepcji drukarki strony dokumentu pojęcie strony.Z punktu widzenia drukarki strona jest na jednym arkuszu papieru.Jednak jeden arkusz papieru nie zawsze jest równa jednej strony dokumentu.Na przykład jeśli drukujesz biuletynu, gdy arkusze są złożony, jednym arkuszu papieru może zawierać pierwszej i ostatniej strony dokumentu obok siebie.Podobnie jeśli arkusz kalkulacyjny, dokument nie zawierać strony na wszystkich.Zamiast tego w jednym arkuszu papieru może zawierać wiersze od 1 do 20, kolumny 6 do 10.
Numery wszystkich stron w CPrintInfo struktury odnoszą się do stron drukarki.Rozmowy w ramach OnPrepareDC i OnPrint raz dla każdego arkusza papieru, który przechodzi przez drukarkę.Kiedy zastąpić OnPreparePrinting funkcji określonego w dokumencie, należy użyć stron drukarki.Jeśli nie ma odpowiednika (to znaczy jednej strony drukarki równe jednej stronie dokumentu), to jest łatwe.Jeżeli, z drugiej strony, dokumentów i stron drukarki bezpośrednio odpowiada, należy przetłumaczyć między nimi.Rozważmy na przykład drukowanie arkusza kalkulacyjnego.Podczas zastępowania OnPreparePrinting, można obliczyć, ile arkuszy papieru będą wymagane, aby wydrukować cały arkusz kalkulacyjny, a następnie użyć tej wartości, podczas wywoływania SetMaxPage Członkowskich funkcji CPrintInfo.Podobnie podczas zastępowania OnPrepareDC, należy przetłumaczyć m_nCurPage w zakres wierszy i kolumn, które będzie wyświetlane na tym arkuszu określonego i odpowiednio dopasować pochodzenia WZIERNIKA.
Czas drukowania podział na strony
W niektórych sytuacjach klasy widok może nie wiedzieć wcześniej jak długo dokument jest aż rzeczywiście zostały wydrukowane.Na przykład załóżmy, że aplikacja nie jest WYSIWYG, tak długość dokumentu na ekranie nie odpowiada długości po wydrukowaniu.
Powoduje problem, aby zastąpić OnPreparePrinting dla klasy widoku: nie można przekazać wartości do SetMaxPage funkcji CPrintInfo struktury, ponieważ nie wiadomo, długość dokumentu.Jeśli użytkownik nie określono numeru strony zatrzyma się przy użyciu okna dialogowego Drukuj, ramy nie wie, kiedy należy zatrzymać drukowania pętli.Jedynym sposobem, aby zatrzymać drukowania pętli jest wydrukować dokument i po jej zakończeniu.Klasa widoku musi sprawdzić na końcu dokumentu podczas drukowania jest, a następnie informuje ramy, kiedy osiągnięty zostanie koniec.
Ramy opiera się na klasy view OnPrepareDC funkcję, aby poinformować go momentu zatrzymania.Po każdym wywołaniu OnPrepareDC, ramy kontroli członkiem CPrintInfo strukturę o nazwie m_bContinuePrinting.Jego wartością domyślną jest TRUE. Jak długo pozostaje więc w ramach kontynuuje drukowanie pętli.Jeśli jest równa FALSE, zatrzymuje ramy.Aby wykonać podział na strony czas drukowania, należy zastąpić OnPrepareDC do sprawdzania, czy koniec dokumentu zostały osiągnięte i ustawić m_bContinuePrinting do FALSE , gdy posiada.
Domyślne wykonania OnPrepareDC ustawia m_bContinuePrinting do FALSE , jeśli bieżąca strona jest większa niż 1.Oznacza to, że jeśli długość dokumentu nie została określona, ramach zakłada, że dokument jest jedna strona.W wyniku tego jest, że należy zachować ostrożność, jeśli wywołanie klasy podstawowej wersji OnPrepareDC.Nie należy zakładać, że m_bContinuePrinting będzie TRUE po wywołaniu wersji klasy podstawowej.