Sdílet prostřednictvím


TN030: Přizpůsobení tisku a tiskového náhledu

[!POZNÁMKA]

Následující technická poznámka nebyla aktualizována, protože byla poprvé zahrnuta v dokumentaci online.V důsledku toho některé postupy a témata mohou být nesprávné nebo zastaralé.Pro nejnovější informace je vhodné vyhledat téma zájmu v dokumentaci online index.

Tato poznámka popisuje proces přizpůsobení náhled tisku a tisk a účely zpětné volání procedury, používané v CView a zpětné volání rutiny a členské funkce CPreviewView.

Problém

Knihovna MFC poskytuje kompletní řešení pro většinu tisk a náhled potřebuje.Ve většině případů je málo dodatečný kód požadované zobrazení pro tisk a náhled.Nicméně existují způsoby, jak optimalizovat tisk, vyžadující značné úsilí ze strany autora a některé aplikace je nutné přidat určité prvky rozhraní do režimu náhledu.

Efektivní tisk

Při aplikaci knihovny MFC tiskne pomocí standardních metod, systém Windows určí, že všechna volání rozhraní grafických zařízení (GDI) výstup metasoubor v paměti.Při EndPage je volána, hraje Windows metafile jednou pro každé pásmo fyzické, vyžadující tiskárny pro tisk na jednu stránku.Během této vykreslování GDI dotazy často přerušit řízení k určení, pokud by měl pokračovat.Postup přerušení obvykle umožňuje zprávy mají být zpracovány tak, aby uživatel může zrušit tiskové úlohy pomocí dialogového okna Tisk.

Bohužel to může zpomalit proces tisku.Pokud tisk v aplikaci, musí být rychlejší, než jakého lze docílit pomocí standardní techniky, musíte implementovat ruční řazení do pásem.

Tisk pruhy

Pro pásmo ručně, musíte re implementovat tisku smyčky tak, aby OnPrint se nazývá několikrát na jedné stránce (jednou za pásmo).Opakovat tisk prováděn v OnFilePrint funkce v viewprnt.cpp.Ve své CView-odvozené třídy, přetížení tuto funkci tak, aby vaše tiskové funkce volání načítání zpráv pro zpracování příkazu print.Kopie OnFilePrint rutina a změna tisku smyčky provádět řazení do pásem.Pravděpodobně budete také chtít předat řazení do pásem obdélník tiskové funkce, takže můžete optimalizovat podle části tištěnou stránku výkresu.

Za druhé, musíte často volat QueryAbort při kreslení v pásmu.Jinak nebude získat nazývá proces přerušit a uživatel bude moci zrušit tiskovou úlohu.

Náhled: Elektronického papíru s uživatelským rozhraním

Náhled, v podstatě se pokusí změnit zobrazení do emulace tiskárny.Standardně klientské oblasti hlavního okna slouží k zobrazení jedné nebo dvou stránek plně uvnitř okna.Uživatel je schopen zvětšit oblast stránky zobrazíte další podrobnosti.Další podpora uživatele i smějí upravit dokument v režimu náhledu.

Přizpůsobení zobrazení náhledu tisku

Tato poznámka zabývá pouze jeden aspekt úprav náhledu: Přidání uživatelského rozhraní do režimu náhledu.Jiné úpravy jsou možné, ale tyto změny jsou mimo rámec této diskuse.

Přidání uživatelského rozhraní do režimu náhledu

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

  2. Příkaz obslužné rutiny pro aspekty uživatelského rozhraní, které si přejete přidáte.

  3. Chcete-li přidat vizuální aspekty k zobrazení, přepsat OnDraw a provádění výkresu po volání CPreviewView::OnDraw.

OnFilePrintPreview

Toto je obslužná rutina příkazů pro náhled tisku.Je jeho výchozí implementace:

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ím podokně aplikace.Ovládací panely, například na stavovém řádku, mohou být uchovávány zadáním v pState ->dwStates členské (to je bitová maska a bity jednotlivých ovládacích panelů, které jsou definovány v AFX_CONTROLBAR_MASK(AFX_IDW_MYBAR)).Okno pState ->nIDMainPane je okno, které bude automaticky skryta a reshown.DoPrintPreview pak vytvoří panel tlačítek pro standardní uživatelské rozhraní náhledu.Pokud je zapotřebí speciální okno zpracování, například zobrazení nebo skrytí ostatními okny, které je třeba provést před DoPrintPreview se nazývá.

Ve výchozím nastavení po dokončení náhledu, vrátí ovládací panely jejich původní státy a hlavní panel na viditelný.Pokud je zapotřebí zvláštní zpracování, to by mělo být provedeno přepsání EndPrintPreview. Pokud DoPrintPreview nezdaří, bude také poskytovat zvláštní zpracování.

DoPrintPreview, se nazývá:

  • ID prostředku dialogové okno šablony panelu nástrojů Náhled.

  • Ukazatel na zobrazení pro tisk pro náhled tisku.

  • Třída běhu třídy zobrazení Náhled.Tento dynamicky vytvoří v DoPrintPreview.

  • Ukazatel CPrintPreviewState.Všimněte si, že musí CPrintPreviewState strukturu (nebo odvozené struktury, pokud aplikace potřebuje další stát zachován) není vytvořit na snímku.Tato struktura musí přežít, dokud se nazývá EndPrintPreview DoPrintPreview je nemodální.

    [!POZNÁMKA]

    Pokud pro podporu tisku je potřeba oddělit zobrazení nebo v zobrazení tříd, mají být předány ukazatel objektu jako druhý parametr.

EndPrintPreview

Toto se nazývá ukončíte režim náhledu.Často je vhodné přejít na stránku v dokumentu, který byl naposledy zobrazen v náhledu tisku.EndPrintPreview je možnost aplikace provést.PInfo ->m_nCurPage člen je stránka, která byla zobrazena naposledy (zcela vlevo, pokud byly zobrazeny dvě stránky) a ukazatel je pokyn, kde na stránce byl zájem uživatele.Vzhledem k tomu, že struktura zobrazení aplikace Neznámý rámce, je nutné zadat kód, který chcete přesunout do zvoleného bodu.

Měli byste provést většinu akcí před volací CView::EndPrintPreview.Volání vrátí zpět účinky DoPrintPreview a odstraní pView, pInfo a primární řadič domény.

// Any further cleanup should be done here.
CView::EndPrintPreview(pDC, pInfo, point, pView);

CWinApp::OnFilePrintSetup

To musí být mapována pro položku nastavení tisku.Ve většině případů není nutné přepsat implementaci.

Stránky nomenklatury

Dalším problémem je, že číslování stránek a pořadí.Pro aplikace typu jednoduchý textový procesor jedná se o jednoduchý problém.Většina systémů náhledu se předpokládá, že každé vytištěné stránce odpovídá jedné stránky v dokumentu.

Při pokusu získat obecné řešení, je vzít v úvahu několik věcí.Představte si CAD systému.Uživatel má výkres, který obsahuje několik listů velikost E.Na E-velikosti (nebo menší, měřítko) plotru, číslování stránek by bylo stejně jako v případě jednoduché.Ale na laserové tiskárně, 16 A velikost stránek na jeden list, tisk, které náhled považují za "stránka"?

Jak uvádí, že úvodní odstavec náhled funguje jako tiskárna.Proto se uživateli zobrazí, co by pocházet z konkrétní tiskárnu, která je vybrána.Je zobrazení, které chcete určit při tisku na každé stránce.

Stránka řetězec popisu v CPrintInfo struktura poskytuje způsob zobrazení čísla stránky uživateli, pokud může být reprezentována jako jedno číslo na jedné stránce (jako "Stránka 1" nebo "stránky 1-2"). Výchozí implementace používá tento řetězec CPreviewView::OnDisplayPageNumber.Pokud je potřeba na jiný monitor, jeden může přepsat tato virtuální funkce, které chcete poskytnout, například "List1, oddílech A, B".

Viz také

Další zdroje

Technické poznámky podle čísel

Technické poznámky podle kategorií