Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.
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í OnPrepareDC
je 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.