TN030: Přizpůsobení tisku a tiskového náhledu
Poznámka
Následující technická poznámka se od prvního zahrnutí do online dokumentace neaktualizovala. V důsledku toho můžou být některé postupy a témata zastaralé nebo nesprávné. Nejnovější informace doporučujeme vyhledat v online indexu dokumentace, které vás zajímá.
Tato poznámka popisuje proces přizpůsobení tisku a náhledu tisku a popisuje účel rutin zpětného volání používané v CView
rutinách zpětného CPreviewView
volání a rutin zpětného volání a členské funkce .
Problém
MFC poskytuje kompletní řešení pro většinu potřeb tisku a náhledu tisku. Ve většině případů je k tisku a náhledu potřeba jen málo dalšího kódu. Existují však způsoby optimalizace tisku, které vyžadují značné úsilí na straně vývojáře, a některé aplikace musí do režimu náhledu tisku přidat konkrétní prvky uživatelského rozhraní.
Efektivní tisk
Když aplikace MFC tiskne pomocí standardních metod, Systém Windows směruje všechna volání výstupu rozhraní GDI (Graphical Device Interface) do metasouboru v paměti. Při EndPage
zavolání systém Windows přehraje metasoubor jednou pro každou fyzickou skupinu, kterou tiskárna vyžaduje k tisku jedné stránky. Během tohoto vykreslování se rozhraní GDI často dotazuje na proceduru přerušení a určí, jestli má pokračovat. Procedura přerušení obvykle umožňuje zpracování zpráv, aby uživatel mohl přerušit tiskovou úlohu pomocí dialogového okna tisku.
Bohužel to může zpomalit proces tisku. Pokud tisk ve vaší aplikaci musí být rychlejší, než lze dosáhnout pomocí standardní techniky, musíte implementovat ruční pruhování.
Tisk pásem
Aby bylo možné ručně řadit pásma, je nutné implementovat smyčku tisku tak, aby OnPrint
se volala vícekrát na stránku (jednou na pásma). Smyčka tisku je implementována OnFilePrint
ve funkci v viewprnt.cpp. Ve vaší CView
-odvozené třídě přetížíte tuto funkci tak, aby položka mapy zpráv pro zpracování příkazu print volá vaši funkci print. Zkopírujte rutinu OnFilePrint
a změňte smyčku tisku tak, aby implementovaly pruhování. Pravděpodobně budete chtít také předat pruhovací obdélník funkcím tisku, abyste mohli optimalizovat výkres na základě oddílu stránky, který se vytiskne.
Za druhé, při kreslení pásma musíte často volat QueryAbort
. Jinak se procedura přerušení nevolá a uživatel nemůže zrušit tiskovou úlohu.
Náhled tisku: Elektronický papír s uživatelským rozhraním
Náhled tisku se v podstatě snaží změnit zobrazení na emulaci tiskárny. Ve výchozím nastavení se klientská oblast hlavního okna používá k zobrazení jedné nebo dvou stránek v okně. Uživatel může přiblížit oblast stránky, aby ho viděl podrobněji. S další podporou může být uživatel dokonce povolený upravovat dokument v režimu náhledu.
Přizpůsobení náhledu tisku
Tato poznámka se zabývá pouze jedním aspektem úprav náhledu tisku: Přidání uživatelského rozhraní do režimu náhledu. Další úpravy jsou možné, ale tyto změny jsou mimo rozsah této diskuze.
Přidání uživatelského rozhraní do režimu náhledu
Odvození třídy zobrazení z
CPreviewView
.Přidejte obslužné rutiny příkazů pro požadované aspekty uživatelského rozhraní.
Pokud přidáváte do zobrazení vizuální aspekty, přepište
OnDraw
a proveďte výkres po voláníCPreviewView::OnDraw
.
OnFilePrintPreview
Toto je obslužná rutina příkazu pro náhled tisku. Výchozí implementace je:
void CView::OnFilePrintPreview()
{
// In derived classes, implement special window handling here
// Be sure to Unhook Frame Window close if hooked.
// must not create this on the frame. Must outlive this function
CPrintPreviewState* pState = new CPrintPreviewState;
if (!DoPrintPreview(AFX_IDD_PREVIEW_TOOLBAR, this,
RUNTIME_CLASS(CPreviewView), pState))
{
// In derived classes, reverse special window handling
// here for Preview failure case
TRACE0("Error: DoPrintPreview failed");
AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
delete pState; // preview failed to initialize, delete State now
}
}
DoPrintPreview
skryje hlavní podokno aplikace. Řídicí panely, například stavový řádek, je možné zachovat jejich zadáním do členu pState-dwStates> (Toto je bitová maska a bity pro jednotlivé řídicí pruhy jsou definovány AFX_CONTROLBAR_MASK( AFX_IDW_MYBAR)). Okno pState-nIDMainPane> je okno, které se automaticky skryje a znovu zobrazí. DoPrintPreview
pak vytvoří panel tlačítek pro standardní uživatelské rozhraní náhledu. Pokud je potřeba speciální zpracování oken, jako je skrytí nebo zobrazení jiných oken, které by se mělo provést před DoPrintPreview
voláním.
Ve výchozím nastavení se po dokončení náhledu tisku vrátí řídicí panely do původních stavů a hlavní podokno, které se zobrazí. Pokud je potřeba speciální zpracování, mělo by být provedeno v přepsání EndPrintPreview
. Pokud DoPrintPreview
selže, poskytněte také speciální zpracování.
DoPrintPreview se volá s:
ID prostředku šablony dialogového okna pro panel nástrojů náhledu
Ukazatel na zobrazení pro tisk náhledu.
Třída run-time třídy Zobrazení náhledu. To se bude dynamicky vytvářet v DoPrintPreview.
Ukazatel CPrintPreviewState. Všimněte si, že V rámci rámce nesmí být vytvořena struktura CPrintPreviewState (nebo odvozená struktura, pokud aplikace potřebuje více stavu zachováno). DoPrintPreview je bez režimu a tato struktura musí přežít, dokud se nevolá EndPrintPreview.
Poznámka
Pokud je pro podporu tisku potřeba samostatné zobrazení nebo třídy zobrazení, měl by se jako druhý parametr předat ukazatel na tento objekt.
EndPrintPreview
Tím se ukončí režim náhledu tisku. Často je žádoucí přejít na stránku v dokumentu, který byl naposledy zobrazen v náhledu tisku. EndPrintPreview
je šance, že to aplikace udělá. PInfo-m_nCurPage> člen je stránka, která byla naposledy zobrazena (vlevo, pokud byly zobrazeny dvě stránky) a ukazatel je tip, jak na stránce, o kterou se uživatel zajímal. Vzhledem k tomu, že struktura zobrazení aplikace je pro architekturu neznámá, musíte zadat kód, který se má přesunout do zvoleného bodu.
Před voláním CView::EndPrintPreview
byste měli provádět většinu akcí . Toto volání obrátí účinky DoPrintPreview
a odstraní pView, pDC a pInfo.
// Any further cleanup should be done here.
CView::EndPrintPreview(pDC, pInfo, point, pView);
CWinApp::OnFilePrintSetup
Musí se namapovat pro položku nabídky Nastavení tisku. Ve většině případů není nutné přepsat implementaci.
Terminologie stránek
Dalším problémem je číslování stránek a pořadí. U jednoduchých aplikací pro textové procesory se jedná o jednoduchý problém. Většina systémů náhledu tisku předpokládá, že každá vytištěná stránka odpovídá jedné stránce v dokumentu.
Při pokusu o poskytnutí generalizovaného řešení je potřeba zvážit několik věcí. Představte si systém CAD. Uživatel má výkres, který pokrývá několik listů velikosti E. V grafu velikosti E (nebo menšího, měřítka) by číslování stránek bylo stejné jako v jednoduchém případě. Ale na laserové tiskárně tiskněte 16 stránek velikosti A na list, co náhled tisku považuje za "stránku".
Jak uvádí úvodní odstavec, náhled tisku funguje jako tiskárna. Proto uživatel uvidí, co by se stalo z vybrané konkrétní tiskárny. Je na zobrazení, abyste zjistili, jaký obrázek se vytiskne na každé stránce.
Řetězec popisu stránky ve CPrintInfo
struktuře poskytuje způsob zobrazení čísla stránky uživateli, pokud může být reprezentován jako jedno číslo na stránku (jako v "Strana 1" nebo "Stránky 1-2"). Tento řetězec se používá ve výchozím nastavení implementace CPreviewView::OnDisplayPageNumber
. Pokud je potřeba použít jiné zobrazení, můžete tuto virtuální funkci přepsat, například List1, Oddíly A, B.
Viz také
Technické poznámky podle čísel
Technické poznámky podle kategorií