TN030: Úpravy, tisk a náhled
[!POZNÁMKA]
Následující technické poznámce nebyly aktualizovány od byla poprvé zahrnuta v dokumentaci online.Proto některé postupy a témata mohou být nesprávné nebo zastaralé.Nejnovější informace je vhodné vyhledat téma zájmu v dokumentaci online index.
Tato poznámka popisuje proces přizpůsobení náhledu tisku a tisku a účely zpětné volání procedury, používané v CView a zpětné volání rutiny a členské funkce CPreviewView.
Problém
MFC poskytuje kompletní řešení pro většinu tisk a náhled potřebuje.Ve většině případů je požadováno zobrazení pro tisk a náhled málo dodatečného kódu.Způsoby optimalizace tisku vyžadující značné intenzitě vývojář a některé aplikace potřebujete přidat konkrétní prvky rozhraní do režimu náhledu.
Efektivní tisk
Při aplikaci MFC tiskne pomocí standardní metody, přesměruje systém Windows všechna volání grafického rozhraní GDI (Device) výstup metasoubor v paměti.Při EndPage je volána, přehraje Windows metafile jednou pro každé pásmo fyzické, vyžadující tiskárny na tisk jedné stránky.Při tomto vykreslování GDI dotazy často přerušit postup určení, pokud by měla pokračovat.Postup přerušení obvykle umožňuje zprávy mají být zpracovány tak, aby uživatel může zrušit tiskovou úlohu pomocí tiskového dialogového okna.
Bohužel to zpomalit proces tisku.Pokud musí být rychlejší než lze dosáhnout pomocí standardní techniky tisku v aplikaci, musíte implementovat ruční řazení do pásem.
Tisk pruhy
Na pásmo ručně, musíte re implementovat tisk opakovat, OnPrint na stránku (jednou za pásmo) se nazývá vícekrát.Opakovat tisk prováděn v OnFilePrint funkce viewprnt.cpp.Ve vaší CView-odvozené třídy, přetěžování tuto funkci tak, že zpráva položku mapování pro zpracování příkazu print volání funkce tisku.Kopie OnFilePrint rutina a změnit tisk opakovat implementovat pruhy.Pravděpodobně budete také chtít předat tiskové funkce řazení do pásem obdélník tak, aby na základě oddílu tištěnou stránku výkresu můžete optimalizovat.
Za druhé musí často volání QueryAbort při kreslení pásma.Jinak získat nebyla volána procedura přerušení a uživatel nebude moci zrušit tiskovou úlohu.
Náhled: Elektronického papíru s uživatelským rozhraním
Náhled před tiskem, v podstatě pokusí změnit zobrazení do emulace tiskárny.Standardně klientské oblasti hlavního okna slouží k zobrazení jedné nebo dvou stránek plně v okně.Uživatel, je možné zvětšit oblast stránky, viz podrobněji.Další podpora uživatele i smějí upravit dokument v režimu náhledu.
Přizpůsobení náhledu
Tato poznámka zabývá pouze jeden aspekt úpravou náhledu: přidání Uživatelského režimu náhledu.Jiné změny jsou možné, ale tyto změny jsou mimo rozsah této diskuse.
Přidání uživatelského rozhraní do režimu náhledu
Odvození třídy zobrazení z CPreviewView.
Přidáte příkaz obslužné rutiny pro druhou aspekty uživatelského rozhraní.
Přidání aspekty vizuální zobrazení přepsat OnDraw a provést výkresu po volání CPreviewView::OnDraw.
OnFilePrintPreview
Toto je popisovač 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 podokno hlavní aplikace.Ovládací panely, například na stavovém řádku, mohou být uchovávány zadáním v pState - >dwStates člena (maska bitů a bitů pro jednotlivé ovládací panely jsou definovány AFX_CONTROLBAR_MASK(AFX_IDW_MYBAR)).Okno pState - >nIDMainPane je okno, které bude automaticky skryté a reshown.DoPrintPreview pak vytvořit tlačítko panel pro standardní uživatelské rozhraní náhledu.Pokud je zapotřebí zvláštní okno zpracování, například jako zobrazení nebo skrytí oken, které by mělo být provedeno 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ím panelu viditelné.Potřeby zvláštní zacházení by měly provést v lokální změna z EndPrintPreview. Pokud DoPrintPreview se nezdaří, bude také poskytovat zvláštní zacházení.
DoPrintPreview, se nazývá:
ID zdroje dialogové okno šablony panelu nástrojů Náhled.
Ukazatel na zobrazení pro tisk pro náhled tisku.
Třída spuštění třídy zobrazení Náhled.To dynamicky vytvoří v DoPrintPreview.
Ukazatel CPrintPreviewState.Poznámka, že struktura CPrintPreviewState (nebo odvozené struktury, pokud aplikace potřebuje další stát zachovány) musí není vytvořena na snímku.DoPrintPreview je nemodální a tato struktura musí překonat, dokud se nazývá EndPrintPreview.
[!POZNÁMKA]
Pokud samostatné zobrazení nebo zobrazení třídy je zapotřebí pro podporu tisku, ukazatel na objekt mají být předány jako druhý parametr.
EndPrintPreview
Tento postup se nazývá ukončit režim náhledu.Často je vhodné přejít na stránku v dokumentu, který byl naposledy zobrazených v náhledu.EndPrintPreview je aplikace umožňující provést.PInfo - >m_nCurPage člen je stránka, která byla zobrazena naposledy (vlevo byly zobrazeny dvě stránky) a ukazatel je Rada, aby kde na stránce uživatele byl zájem.Struktura zobrazení aplikace, protože neznámý rámci musíte zadat kód, který chcete přesunout na zvolený bod.
Je třeba provést většinu akcí před voláním CView::EndPrintPreview.Volání vrátí účinky DoPrintPreview a odstraní pView pDC a pInfo.
// Any further cleanup should be done here.
CView::EndPrintPreview(pDC, pInfo, point, pView);
CWinApp::OnFilePrintSetup
To musí být mapována položky nabídky Nastavení tisku.Ve většině případů není nutné přepíší implementaci.
Stránka nomenklatury
Dalším problémem je číslování stránek a pořadí.Pro jednoduchý textový procesor typ aplikace toto je jednoduchý problém.Většina systémů náhled předpokládá každé vytištěné stránce odpovídá jedné stránky v dokumentu.
Při pokusu o zobecněné řešením, existuje několik zvážit.Představte si CAD systému.Uživatel má výkres, který zahrnuje několik listů e velikost.Na E-velikost (nebo menší, měřítko) plotru, číslování stránek by v případě jednoduché.Ale na laserové tiskárně tisk 16 A velikosti stránek na list, co náhledu zvážit "stránka"?
Jako úvodní odstavec státy, náhled se chová jako tiskárna.Proto se uživateli zobrazí, co by pocházet z určitého vybrané tiskárny.Je na zobrazení určit, jaké tisku na každé stránce.
Stránka řetězec popisu v CPrintInfo struktury umožňuje zobrazování čísla stránky uživateli, pokud lze znázornit jako jedno číslo na stránku (jako v "Stránka 1" nebo "stránky 1-2").Tento řetězec je použit výchozí provádění CPreviewView::OnDisplayPageNumber.Tato virtuální funkce, například "List1, oddílech A, B" jeden může přepsat, potřeby různých zobrazení.