Sdílet prostřednictvím


Dokumenty s více stránkami

Tento článek popisuje tiskový protokol systému Windows a vysvětluje, jak tisknout dokumenty, které obsahují více než jednu stránku. Článek se zabývá následujícími tématy:

Protokol tisku

Pokud chcete vytisknout vícestránkový dokument, architektura a zobrazení interagují následujícím způsobem. Nejprve architektura zobrazí dialogové okno Tisk , vytvoří kontext zařízení pro tiskárnu a zavolá funkci StartDoc člena CDC objektu. Pak pro každou stránku dokumentu rozhraní volá členskou funkci StartPage objektu, udělí objektu zobrazení pokyn k vytištění stránky a volá členskou funkci CDC. Pokud je třeba změnit režim tiskárny před spuštěním konkrétní stránky, zobrazení volá ResetDC, který aktualizuje strukturu DEVMODE obsahující informace o novém režimu tiskárny. Po vytištění celého dokumentu volá architektura členovou funkci EndDoc .

Přepisování funkcí třídy zobrazení

CView třída definuje několik členských funkcí, které jsou volány rozhraním během tisku. Přepsáním těchto funkcí ve vaší třídě zobrazení poskytnete propojení mezi tiskovou logikou rámce a tiskovou logikou vaší třídy zobrazení. Následující tabulka uvádí tyto členské funkce.

Přepisovatelné funkce v CView pro tisk

Název Důvod překonání
OnPreparePrinting Vložení hodnot do dialogového okna Tisk, zejména délky dokumentu
OnBeginPrinting Přidělit písma nebo jiné prostředky GDI
OnPrepareDC Úprava atributů kontextu zařízení pro danou stránku nebo pro stránkování v době tisku
OnPrint Vytištění dané stránky
PřiUkončeníTisku Uvolnění prostředků GDI

Zpracování související s tiskem můžete provádět i v jiných funkcích, ale tyto funkce jsou ty, které řídí proces tisku.

Následující obrázek znázorňuje kroky spojené s procesem tisku a ukazuje, kde se volají jednotlivé funkce pro tisk komponenty CView. Zbytek tohoto článku vysvětluje většinu těchto kroků podrobněji. Další části tiskového procesu jsou popsány v článku Přidělování prostředků GDI.

Proces tiskové smyčky.
Smyčka tisku

Stránkování

Architektura ukládá většinu informací o tiskové úloze ve struktuře CPrintInfo . Několik hodnot v CPrintInfo, které se týkají stránkování; tyto hodnoty jsou přístupné, jak je uvedeno v následující tabulce.

Informace o čísle stránky uložené v CPrintInfo

Členská proměnná nebo

názvy funkcí
Číslo stránky odkazované
GetMinPage/SetMinPage První stránka dokumentu
GetMaxPage/SetMaxPage Poslední stránka dokumentu
GetFromPage První stránka, která se má vytisknout
GetToPage Poslední stránka, která se má vytisknout
m_nCurPage Stránka, která se právě tiskne

Čísla stránek začínají číslem 1, tj. první stránka je číslo 1, nikoli 0. Další informace o těchto a dalších členech CPrintInfo naleznete v tématu MFC Reference.

Na začátku tiskového procesu volá rámec členskou funkci OnPreparePrinting zobrazení a předává ukazatel na strukturu CPrintInfo. Průvodce aplikací poskytuje implementaci OnPreparePrinting , která volá DoPreparePrinting, další člen funkce CView. DoPreparePrinting je funkce, která zobrazí dialogové okno Tisk a vytvoří kontext zařízení tiskárny.

V tomto okamžiku aplikace neví, kolik stránek je v dokumentu. Používá výchozí hodnoty 1 a 0xFFFF pro čísla první a poslední stránky dokumentu. Pokud víte, kolik stránek má váš dokument, změňte OnPreparePrinting a zavolejte [SetMaxPage]--brokenlink---(reference/cprintinfo-class.md#setmaxpage) pro strukturu CPrintInfo než jej odešlete do DoPreparePrinting. Díky tomu můžete zadat délku dokumentu.

DoPreparePrinting pak zobrazí dialogové okno Tisk. Když se vrátí, CPrintInfo struktura obsahuje hodnoty určené uživatelem. Pokud si uživatel přeje vytisknout jenom vybraný rozsah stránek, může v dialogovém okně Tisk zadat počáteční a koncová čísla stránek. Rámec načte tyto hodnoty pomocí funkcí GetFromPage a GetToPage z CPrintInfo. Pokud uživatel nezadá rozsah stránek, rozhraní zavolá GetMinPage a GetMaxPage použije hodnoty vrácené k vytištění celého dokumentu.

Pro každou stránku dokumentu, která se má vytisknout, volá architektura ve vaší třídě zobrazení dvě členské funkce, OnPrepareDC a OnPrint a předává každou funkci dvěma parametry: ukazatel na objekt CDC a ukazatel na CPrintInfo strukturu. Pokaždé, když rámec volá OnPrepareDC a OnPrint, předává jinou hodnotu v členu struktury CPrintInfo. Tímto způsobem rámec předá zobrazení, která stránka se má vytisknout.

Členová funkce OnPrepareDC se používá také pro zobrazení obrazovky. Před zahájením kreslení provádí úpravy kontextu zařízení. OnPrepareDC má podobnou funkci při tisku, ale existuje několik rozdílů: zaprvé, CDC objekt představuje kontext zařízení tiskárny místo kontextu zařízení obrazovky, a zadruhé, CPrintInfo objekt se předává jako druhý parametr. (Tento parametr má hodnotu NULL, když je OnPrepareDC volán pro zobrazení na obrazovce.) Přepište OnPrepareDC, abyste provedli úpravy kontextu zařízení na základě toho, která stránka se tiskne. Můžete například přesunout původ oblasti zobrazení a oblast výřezu, abyste měli jistotu, že se vytiskne příslušná část dokumentu.

Členské funkce OnPrint provádí skutečný tisk stránky. Článek Jak se výchozí tisk provádí , ukazuje, jak rozhraní volá OnDraw s kontextem zařízení tiskárny k provedení tisku. Přesněji řečeno, rámec volá OnPrint se strukturou CPrintInfo a kontextem zařízení, a OnPrint předává kontext zařízení OnDraw. Přepište OnPrint pro provedení jakéhokoli vykreslování, které má být provedeno pouze při tisku a ne při zobrazení na obrazovce. Pokud chcete například vytisknout záhlaví nebo zápatí (další informace najdete v článku Záhlaví a zápatí ). Potom zavolejte OnDraw při přepsání OnPrint, aby se provedlo vykreslování společné pro zobrazení na obrazovce i pro tisk.

Skutečnost, že OnDraw provádí vykreslování jak pro zobrazení na obrazovce, tak pro tisk, znamená, že vaše aplikace je WYSIWYG: "Co vidíte, je to, co dostanete." Předpokládejme ale, že nepíšete WYSIWYG aplikaci. Představte si například textový editor, který pro tisk používá tučné písmo, ale zobrazuje řídicí kódy pro označení tučného textu na obrazovce. V takové situaci použijete OnDraw výhradně pro zobrazení obrazovky. Při přepsání OnPrint nahraďte volání OnDraw voláním na samostatnou funkci kreslení. Tato funkce nakreslí dokument tak, jak se zobrazuje na papíře, pomocí atributů, které se na obrazovce nezobrazují.

Stránky tiskárny versus stránky dokumentů

Když odkazujete na čísla stránek, je někdy nutné rozlišovat mezi vnímáním stránky tiskárny a vnímáním stránky v dokumentu. Z pohledu tiskárny je stránka jedním listem papíru. Jeden list papíru se ale nemusí nutně rovnat jedné stránce dokumentu. Pokud například tisknete bulletin, kde mají být listy přeloženy, může jeden list papíru obsahovat obě první i poslední stránky dokumentu vedle sebe. Podobně platí, že pokud tisknete tabulku, nebude se dokument vůbec skládat ze stránek. Místo toho může jeden list papíru obsahovat řádky 1 až 20 sloupců 6 až 10.

Všechna čísla stránek ve struktuře CPrintInfo odkazují na stránky tiskárny. Framework volá OnPrepareDC a OnPrint jednou pro každý list papíru, který projde tiskárnou. Při přepsání funkce OnPreparePrinting za účelem určení délky dokumentu je nutné použít stránky tiskárny. Pokud existuje korespondence 1:1 (to znamená, že jedna stránka tiskárny se rovná jedné stránce dokumentu), je to snadné. Pokud naopak stránky dokumentu a stránky tiskárny přímo neodpovídají, musíte mezi nimi přeložit. Zvažte například tisk tabulky. Při přepsání OnPreparePrinting musíte vypočítat, kolik listů papíru bude nutné k vytištění celé tabulky, a tuto hodnotu pak použít při volání členské funkce SetMaxPage z CPrintInfo. Podobně při přepsání OnPrepareDCje nutné přeložit m_nCurPage do oblasti řádků a sloupců, které se zobrazí na daném listu, a potom odpovídajícím způsobem upravit původ oblasti zobrazení.

stránkování Print-Time

V některých situacích vaše třída zobrazení nemusí předem vědět, jak dlouhý je dokument, dokud není skutečně vytištěn. Předpokládejme například, že vaše aplikace není WYSIWYG, takže délka dokumentu na obrazovce neodpovídá její délce při tisku.

To způsobí problém při přepsání OnPreparePrinting pro vaši třídu zobrazení: nemůžete totiž předat hodnotu funkci SetMaxPage struktury CPrintInfo, protože neznáte délku dokumentu. Pokud uživatel nezadá číslo stránky, které se má zastavit pomocí dialogového okna Tisk, architektura neví, kdy se má smyčka tisku zastavit. Jediným způsobem, jak určit, kdy zastavit smyčku tisku, je vytisknout dokument a podívat se, kdy skončí. Třída zobrazení musí během tisku zkontrolovat konec dokumentu a pak informovat rozhraní o dosažení konce.

Architektura spoléhá na funkci OnPrepareDC vaší třídy zobrazení, která ji upozorní, kdy se má zastavit. Po každém volání OnPrepareDC rozhraní zkontroluje člen struktury CPrintInfo, který se nazývá m_bContinuePrinting. Výchozí hodnota je TRUE. Dokud tak zůstane, rámec pokračuje ve smyčce tisku. Pokud je hodnota nastavena na FALSE, framework se zastaví. Chcete-li provést stránkování v době tisku, přepište OnPrepareDC, abyste zkontrolovali, zda byl dosažen konec dokumentu, a nastavte m_bContinuePrinting na FALSE, když tomu tak je.

Výchozí implementace OnPrepareDC nastaví m_bContinuePrinting na FALSE, pokud je aktuální stránka větší než 1. To znamená, že pokud nebyla zadána délka dokumentu, architektura předpokládá, že dokument je dlouhý o jednu stránku. Jedním z důsledků je, že musíte být opatrní, pokud voláte verzi základní třídy OnPrepareDC. Nepředpokládej, že m_bContinuePrinting bude TRUE po volání verze základní třídy.

O čem chcete vědět víc

Viz také

Tisk
CView – třída
CDC – třída