Sdílet prostřednictvím


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 CPreviewViewvolá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í.

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 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

  1. Odvození třídy zobrazení z CPreviewView.

  2. Přidejte obslužné rutiny příkazů pro požadované aspekty uživatelského rozhraní.

  3. 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::EndPrintPreviewbyste 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í