Dokumenty wielostronicowe
Ten artykuł opisuje protokół drukowania systemu Windows i wyjaśniono, jak drukowanie dokumentów, które zawierają więcej niż jedną stronę.Artykuł obejmuje następujące tematy:
Protokół drukowania
Przeglądanie funkcji klasy nadrzędne
Podział na strony
Vs stron drukarki. strony dokumentu
Godzina drukowania podział na strony
Protokół drukowania
Aby wydrukować wielostronicowy dokument, ramy i widok współdziałać w następujący sposób.Po raz pierwszy wyowietli ramach wydruku okno dialogowe tworzy kontekstu urządzenia drukarki i wywołania StartDoc funkcji członka z CDC obiektu.Następnie, dla każdej strony dokumentu ramach wywołania Strona główna funkcji członka z CDC obiektów, powoduje, że obiekt typu widok drukowania strony i wywołania EndPage funkcji składowej.Jeśli tryb drukarki musi zostać zmienione przed rozpoczęciem określonej strony, widok wywołuje ResetDC, które aktualizacje DEVMODE struktury zawierające nowe informacje o drukarce trybu.Jeżeli został wydrukowany cały dokument, wywołuje ramach EndDoc funkcji składowej.
Przeglądanie funkcji klasy nadrzędne
CView klasa definiuje kilka funkcji elementów członkowskich, które są wywoływane przez architekturę podczas drukowania.Przez zastąpienie tych funkcji w klasie widoku, możesz podać połączeń między framework poligraficznych logiki i logiki drukowania swojej klasy widoku.Poniższa tabela zawiera listę tych funkcji elementów członkowskich.
Funkcje NotOverridable CView's do drukowania
Nazwa |
Przyczynę zastąpienia |
---|---|
Aby wstawić wartości w oknie dialogowym Drukuj, zwłaszcza długość dokumentu |
|
Aby przydzielić czcionek lub innych zasobów GDI |
|
Aby dopasować atrybuty kontekstu urządzenia dla danej strony, lub to zrobić stronicowanie godzina drukowania |
|
Aby wydrukować stronę danego |
|
Aby cofnąć przydział zasobów GDI |
Można zrobić przetwarzania w także inne funkcje związane z drukowaniem, ale te funkcje są te, które wpływają na proces drukowania.
Następujący rysunek ilustruje etapy procesu drukowania i pokazuje, gdzie każdy z CViewjest drukowanie Członkowskich funkcje są wywoływane.W dalszej części tego artykułu wyjaśnia większość te kroki bardziej szczegółowo.Dodatkowe części procesu drukowania są opisane w artykule Przydzielanie zasobów GDI.
Pętla drukowania
Podział na strony
Ramach 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 informacji przechowywanych 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 1, czyli pierwszej strony ponumerowany jest różna od 0, 1.Aby uzyskać więcej informacji na temat tych i innych członków CPrintInfo, zobacz Odwołanie MFC.
Na początku procesu drukowania ramach wywołuje widoku OnPreparePrinting funkcji składowej, przekazując wskaźnik do CPrintInfo struktury.Kreator aplikacji stanowi implementację OnPreparePrinting wywołującym DoPreparePrinting, innej funkcji członka z CView.DoPreparePrintingjest to funkcja, która powoduje wyświetlenie okna dialogowego Drukuj i tworzy kontekstu urządzenia drukarki.
W tym momencie aplikacja nie wie, ile stron są w dokumencie.Używa wartości domyślnych 1 i 0xFFFF numery pierwszej i ostatniej strony dokumentu.Jeśli wiesz, ile stron dokumentu ma, zastąpić OnPreparePrinting i wywołać SetMaxPage dla CPrintInfo struktury przed wysłaniem go do DoPreparePrinting.Dzięki temu można określić długość dokumentu.
DoPreparePrintingnastępnie wyświetla okno dialogowe Drukuj.Kiedy wraca, CPrintInfo struktura zawiera wartości określonych przez użytkownika.Jeśli użytkownik chce, aby wydrukować tylko zaznaczony zakres stron, numery pierwszej i ostatniej strony w oknie dialogowym Drukuj można określić on lub ona.Ramach 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 do drukowania w całym dokumencie.
Dla każdej strony dokumentu ma być drukowany ramach wywołuje dwóch funkcji elementów członkowskich w klasie view 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ń framework OnPrepareDC i OnPrint, przechodzi inną wartość w m_nCurPage członek CPrintInfo struktury.W ten sposób ramach informuje o tym widoku stronę, która ma być drukowana.
OnPrepareDC funkcji składowej służy także do wyświetlania na ekranie.To sprawia, że zmiany kontekstu urządzenia przed dokonaniem rysunku.OnPrepareDCpodobną rolę pełni w druku, ale istnieje kilka różnic: pierwszy, CDC reprezentuje obiekt kontekstu urządzenia drukarki zamiast kontekstu urządzenia ekranu, a po drugie, CPrintInfo obiekt jest przekazywany jako drugi parametr. (Ten parametr jest wartości NULL po OnPrepareDC nosi nazwę do wyświetlania na ekranie.) Zastąpić OnPrepareDC zmiany kontekstu urządzenia oparte na stronę, która jest drukowane.Na przykład można przenieść pochodzenia wziernika i obszar przycinania, aby zapewnić, że właściwe części dokument zostanie wydrukowany.
OnPrint funkcji składowej wykonuje rzeczywiste drukowanie strony.Artykuł Jak domyślna drukowanie odbywa się pokazuje, jak wywołuje ramach OnDraw z kontekstu urządzenia drukarki, aby wykonać wydruk.Dokładniej, wywołania framework OnPrint z CPrintInfo struktury i kontekstu urządzenia, i OnPrint przechodzi kontekstu urządzenia do OnDraw.Zastąpić OnPrint do wykonywania wszelkie efekty renderingu, co należy zrobić, tylko podczas drukowania, a nie do wyświetlania na ekranie.Na przykład, aby wydrukować nagłówki lub stopki (zobacz artykuł nagłówków i stopek uzyskać więcej informacji).Następnie wywołać OnDraw z ręcznej zmiany z OnPrint do renderowania wspólne dla obu ekranu i drukowania.
Fakt że OnDraw czy renderowanie zarówno wyświetlanie na ekranie i drukowania oznacza, że dana aplikacja jest WYSIWYG: "to, co widzisz jest what you get". Jednakże Załóżmy, że nie są pisania aplikacji WYSIWYG.Przykładowy tekst edytor, który używa czcionki pogrubionej do druku, ale wyświetla kody sterujące do wskazania pogrubienie tekstu na ekranie.W takiej sytuacji należy użyć OnDraw ściśle do wyświetlania na ekranie.Kiedy można zastąpić OnPrint, zastąpić wywołanie OnDraw z wezwaniem do oddzielnej funkcji rysunku.Ta funkcja zwraca dokument sposobu wyświetlania na papierze, używając atrybutów, które użytkownik nie są wyświetlane na ekranie.
Vs stron drukarki. Strony dokumentu
Przy odwoływaniu się do numerów stron, czasami jest konieczne odróżnienie pojęcie drukarki strony i pojęcia dokument na stronę.Z punktu widzenia drukarki strona jest jeden arkusz papieru.Jednak jeden arkusz papieru nie koniecznie jest równa jednej stronie dokumentu.Na przykład jeśli drukujesz biuletyn, w którym arkusze mają być składane, jeden arkusz papieru może zawierać pierwszej i ostatniej strony dokumentu obok siebie.Podobnie jeśli drukujesz arkusz kalkulacyjny dokumentu nie składa się z stron w ogóle.Zamiast tego jeden arkusz papieru może zawierać wiersze od 1 do 20, kolumny 6 do 10.
Numeruje wszystkie strony w CPrintInfo struktury odnoszą się do stron drukarki.Wywołania framework OnPrepareDC i OnPrint raz dla każdego arkusza papieru, który będzie przechodzić przez drukarkę.Kiedy można zastąpić OnPreparePrinting funkcjonować, aby określić długość dokumentu, należy użyć stron drukarki.Jeśli ma odpowiednika (czyli jednej strony drukarki jest równa jednej stronie dokumentu), a następnie jest to łatwe.Jeżeli, z drugiej strony, dokumentów i stron drukarki nie bezpośrednio odpowiada, należy przetłumaczyć między nimi.Rozważmy na przykład drukowanie arkusza kalkulacyjnego.Gdy zastępowanie OnPreparePrinting, należy je obliczać, ile kartek papieru będzie musiał wydrukować cały arkusz kalkulacyjny, a następnie użyć tej wartości podczas wywoływania SetMaxPage funkcji składowej z CPrintInfo.Podobnie gdy zastępowanie OnPrepareDC, należy przetłumaczyć m_nCurPage w zakres wierszy i kolumn, które będą wyświetlane na tym określonego arkusza i odpowiednio dopasować pochodzenia wziernika.
Godzina drukowania podział na strony
W niektórych sytuacjach klasy widok może nie wiedzieć z wyprzedzeniem jak długo jest dokument, dopóki rzeczywiście zostały wydrukowane.Na przykład załóżmy, że aplikacja nie jest WYSIWYG, więc długość dokumentu na ekranie nie odpowiada jego długość po wydrukowaniu.
Powoduje problem, aby zastąpić OnPreparePrinting dla swojej klasy widoku: nie można przekazać wartości do SetMaxPage funkcja CPrintInfo , ponieważ struktura nie znasz długość dokumentu.Jeśli użytkownik nie określono numeru strony zatrzyma się przy użyciu okna dialogowego Drukuj, ramach nie wie, kiedy należy zatrzymać drukowania pętli.Jedynym sposobem na określenie zatrzymać drukowania pętli jest wydrukować dokument i zobaczyć, kiedy się kończy.Klasa widoku musi sprawdzić na końcu dokumentu podczas drukowania jest, a następnie informuje ramach po osiągnięciu końca.
Ramach opiera się na swojej klasy view OnPrepareDC funkcji, aby poinformować go momentu zatrzymania.Po każdym wywołaniu z OnPrepareDC, ramach sprawdza członkiem CPrintInfo strukturę o nazwie m_bContinuePrinting.Jego wartością domyślną jest TRUE. Tak długo, jak długo pozostaje tak w ramach nadal wydruku pętli.Jeśli jest równa FALSE, zatrzymuje framework.Aby wykonać podział na strony w czasie drukowania, należy zastąpić OnPrepareDC sprawdzić czy koniec dokumentu został osiągnięty i ustawić m_bContinuePrinting do FALSE , gdy ma ona.
Domyślna implementacja z OnPrepareDC ustawia m_bContinuePrinting do FALSE Jeśli bieżąca strona jest większa niż 1.Oznacza to, że jeśli długość dokument nie został określony, ramach zakłada, że dokument jest przez jedną stronę.Jedną konsekwencją tego jest to, ż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 klasy podstawowej wersji.