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.
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 OnDraw
zaří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í OnPrint
nahraď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í OnPreparePrinting
musí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í OnPrepareDC
je 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í OnPrepareDC
rozhraní 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 .