Sdílet prostřednictvím


Vícestránkové dokumenty

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á členovou funkci CDC StartPage objektu, dává objektu zobrazení pokyn k vytištění stránky a volá funkci člena EndPage. 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řepsá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 třídě zobrazení poskytnete propojení mezi tiskovou logikou architektury a tiskovou logikou třídy zobrazení. Následující tabulka uvádí tyto členské funkce.

Přepisovatelné funkce CView pro tisk

Jméno Důvod přepsání
OnPreparePrinting Vložení hodnot do dialogového okna Tisk, zejména délky dokumentu
OnBeginPrinting Přidělení písem nebo jiných prostředků GDI
OnPrepareDC Úprava atributů kontextu zařízení pro danou stránku nebo pro stránkování v době tisku
OnPrint Tisk dané stránky
OnEndPrinting 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é CViewčlenské funkce tisku. 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.

Printing loop process.
Smyčka tisku

Stránkování

Architektura ukládá většinu informací o tiskové úloze ve struktuře CPrintInfo . Několik hodnot, které CPrintInfo se týkají stránkování; tyto hodnoty jsou přístupné, jak je znázorněno 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á architektura členskou funkci OnPreparePrinting zobrazení a předává ukazatel do CPrintInfo struktury. 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á dokument, přepište OnPreparePrinting a zavolejte [SetMaxPage]--brokenlink---(reference/cprintinfo-class.md#setmaxpage) struktury CPrintInfo před odesláním 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. Architektura načte tyto hodnoty pomocí GetFromPage funkcí GetToPage 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ž architektura volá OnPrepareDC a OnPrint, předává jinou hodnotu v m_nCurPage člen CPrintInfo struktury. Tímto způsobem architektura řekne 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 obsluhuje podobnou roli při tisku, ale existuje několik rozdílů: nejprve CDC objekt představuje kontext zařízení tiskárny místo kontextu zařízení obrazovky a druhý CPrintInfo objekt se předá jako druhý parametr. (Tento parametr je NULL při OnPrepareDC vyvolání zobrazení obrazovky.) Přepsáním OnPrepareDC provedete úpravy kontextu zařízení na základě toho, na které stránce 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, architektura volá OnPrint CPrintInfo strukturu a kontext zařízení a OnPrint předává kontext OnDrawzařízení . Přepsáním proveďte OnPrint jakékoli vykreslování, které by se mělo provést pouze při tisku, a ne při zobrazení obrazovky. Pokud chcete například vytisknout záhlaví nebo zápatí (další informace najdete v článku Záhlaví a zápatí ). Potom zavolejte OnDraw z přepsání OnPrint , aby vykreslování společné pro zobrazení obrazovky i tisk.

Skutečnost, že OnDraw vykreslování pro zobrazení i tisk obrazovky znamená, že vaše aplikace je WYSIWYG: "Co vidíte, je to, co získáte." Předpokládejme ale, že nepíšete aplikaci WYSIWYG. 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í OnPrintnahraďte voláním OnDraw samostatné funkce 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 konceptem stránky tiskárny a konceptem dokumentu stránky. 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. Architektura volá OnPrepareDC a OnPrint jednou pro každý list papíru, který projde tiskárnou. Při přepsání funkce OnPreparePrinting určit délku 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í OnPreparePrintingmusíte vypočítat, kolik listů papíru bude nutné k vytištění celé tabulky, a pak tuto hodnotu použít při volání SetMaxPage členské funkce CPrintInfo. Podobně při přepsání OnPrepareDCje nutné přeložit m_nCurPage do rozsahu řá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í v čase tisku

V některých situacích nemusí vaše třída zobrazení předem vědět, jak dlouho je dokument 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í: Nelze předat hodnotu SetMaxPage funkci CPrintInfo struktury, 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í OnPrepareDCrozhraní zkontroluje člen CPrintInfo struktury, který se nazývá m_bContinuePrinting. Výchozí hodnota je PRAVDA. Dokud zůstane, architektura pokračuje ve smyčce tisku. Pokud je nastavená hodnota NEPRAVDA, architektura 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 HODNOTU FALSE , pokud má.

Výchozí implementace OnPrepareDC sad 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 při volání základní třídy verze OnPrepareDC. Nepředpokládáme, že m_bContinuePrinting bude po volání verze základní třídy true .

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

Viz také

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