Dela via


TN030: Anpassa utskrift och förhandsgranskning

Anmärkning

Följande tekniska anmärkning har inte uppdaterats sedan den först inkluderades i onlinedokumentationen. Därför kan vissa procedurer och ämnen vara inaktuella eller felaktiga. För den senaste informationen rekommenderar vi att du söker efter det intressanta ämnet i onlinedokumentationsindexet.

Den här anteckningen beskriver processen att anpassa utskrift och förhandsgranskning av utskrift och beskriver syftet med de återanropsrutiner som används i CView samt återanropsrutinerna och medlemsfunktionerna i CPreviewView.

Problemet

MFC är en komplett lösning för de flesta utskrifts- och utskriftsförhandsgranskningsbehov. I de flesta fall krävs lite ytterligare kod för att en vy ska kunna skrivas ut och förhandsgranskas. Det finns dock sätt att optimera utskrifter som kräver betydande arbete från utvecklarens sida, och vissa program måste lägga till specifika användargränssnittselement i förhandsgranskningsläget.

Effektiv utskrift

När ett MFC-program skrivs ut med standardmetoderna dirigerar Windows alla GDI-utdataanrop (Graphical Device Interface) till en minnesintern metafil. När EndPage anropas spelar Windows upp metafilen en gång för varje fysiskt band som skrivaren behöver för att skriva ut en sida. Under den här återgivningen kontrollerar GDI ofta avbrottsförfarandet för att avgöra om det ska fortsätta. Vanligtvis tillåter avbruten procedur att meddelanden bearbetas så att användaren kan avbryta utskriftsjobbet med hjälp av en utskriftsdialogruta.

Detta kan tyvärr göra utskriftsprocessen långsammare. Om utskriften i programmet måste vara snabbare än vad som kan uppnås med hjälp av standardtekniken måste du implementera manuell bandning.

För att kunna utföra bandning manuellt måste du implementera utskriftsloopen igen, så att OnPrint anropas flera gånger per sida (en gång per band). Utskriftsloopen OnFilePrint implementeras i funktionen i viewprnt.cpp. I din CView-härledda klass överbelastar du den här funktionen så att meddelandekartans post för hantering av utskriftskommandot anropar din utskriftsfunktion. Kopiera rutinen OnFilePrint och ändra utskriftsloopen för att implementera bandning. Du vill förmodligen också skicka rektangeln för bandning till dina utskriftsfunktioner så att du kan optimera ritningen baserat på avsnittet på sidan som skrivs ut.

För det andra måste du anropa QueryAbort ofta när du ritar bandet. Annars anropas inte abortproceduren och användaren kan inte avbryta utskriftsjobbet.

Förhandsgranskningen försöker i huvudsak omvandla bildskärmen till en emulering av en skrivare. Som standard används klientområdet i huvudfönstret för att visa en eller två sidor helt i fönstret. Användaren kan zooma in på ett område på sidan för att se den mer detaljerat. Med ytterligare stöd kan användaren till och med tillåtas att redigera dokumentet i förhandsgranskningsläge.

Anpassa förhandsgranskning

Den här anteckningen handlar bara om en aspekt av att ändra förhandsgranskning: Lägga till användargränssnitt i förhandsgranskningsläge. Andra ändringar är möjliga, men sådana ändringar ligger utanför omfånget för den här diskussionen.

Så här lägger du till användargränssnittet i förhandsgranskningsläget

  1. Härled en vyklass från CPreviewView.

  2. Lägg till kommandohanterare för de gränssnittsaspekter som du önskar.

  3. Om du lägger till visuella element till skärmen, överlagra OnDraw och utför din ritning efter att du har anropat CPreviewView::OnDraw.

OnFilePrintFörhandsversion

Det här är kommandohanteraren för förhandsgranskning. Standardimplementeringen är:

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 döljer huvudfönstret i programmet. Kontrollstaplar, till exempel statusfältet, kan behållas genom att ange dem i medlemmen > (detta är en bitmask och bitarna för enskilda kontrollstaplar definieras av AFX_CONTROLBAR_MASK( AFX_IDW_MYBAR)). Fönstret > är det fönster som automatiskt döljs och visas igen. DoPrintPreview skapar sedan ett knappfält för standardgränssnittet för förhandsversionen. Om särskild fönsterhantering behövs, till exempel för att dölja eller visa andra fönster, bör detta göras innan DoPrintPreview anropas.

När förhandsgranskningen är klar returnerar den som standard kontrollstaplarna till sina ursprungliga tillstånd och huvudfönstret till synligt. Om särskild hantering behövs bör det göras i en överskrivning av EndPrintPreview. Om DoPrintPreview misslyckas, tillhandahåll även särskild hantering.

DoPrintPreview anropas med:

  • Resurs-ID för dialogmallen för verktygsfältet för förhandsversionen.

  • En pekare till vyn för att utföra utskriften för förhandsgranskningen.

  • Körningstidsklassen för Preview View-klassen. Detta skapas dynamiskt i DoPrintPreview.

  • CPrintPreviewState-pekaren. Observera att CPrintPreviewState-strukturen (eller den härledda strukturen om programmet behöver mer tillstånd bevarat) inte får skapas i ramen. DoPrintPreview är lägeslös, och strukturen måste förbli intakt tills EndPrintPreview anropas.

    Anmärkning

    Om en separat vy eller vyklass behövs för utskriftsstöd bör en pekare till objektet skickas som den andra parametern.

Avsluta förhandsgranskning av utskrift

Detta anropas för att avsluta förhandsgranskningsläget. Det är ofta önskvärt att flytta till sidan i dokumentet som senast visades i förhandsgranskningen. EndPrintPreview är applikationens chans att göra det. PInfo-m_nCurPage-medlemmen är den sida som senast visades (längst till vänster om två sidor visades) och pekaren är ett tips om var på sidan användaren var intresserad.> Eftersom strukturen i programmets vy är okänd för ramverket måste du ange koden för att flytta till den valda punkten.

Du bör utföra de flesta åtgärder innan du anropar CView::EndPrintPreview. Det här anropet återställer effekterna av DoPrintPreview och tar bort pView, pDC och pInfo.

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

CWinApp::OnFilePrintSetup

Detta måste mappas för menyalternativet Utskriftsinstallation. I de flesta fall är det inte nödvändigt att åsidosätta implementeringen.

Nomenklatur för sida

Ett annat problem är sidnumreringen och ordningen. För enkla ordbehandlingsprogram är det här ett enkelt problem. De flesta system för förhandsgranskning förutsätter att varje utskriven sida motsvarar en sida i dokumentet.

När du försöker tillhandahålla en generaliserad lösning finns det flera saker att tänka på. Föreställ dig ett CAD-system. Användaren har en ritning som täcker flera E-storleksblad. På en plotter med E-format (eller ett mindre, skalat format) skulle sidnumreringen vara som i det enkla fallet. Men på en laserskrivare, som skriver ut 16 A4-sidor per ark, vad anses som en "sida" i förhandsgranskningen?

Som det står i det inledande stycket, fungerar Utskriftsförhandsgranskning som en skrivare. Därför ser användaren vad som skulle komma ut av den specifika skrivare som har valts. Det är upp till vyn att avgöra vilken bild som skrivs ut på varje sida.

Sidbeskrivningssträngen CPrintInfo i strukturen ger ett sätt att visa sidnumret för användaren om det kan representeras som ett tal per sida (som i "Sida 1" eller "Sidor 1-2"). Den här strängen används av standardimplementeringen av CPreviewView::OnDisplayPageNumber. Om en annan visning behövs kan man åsidosätta den här virtuella funktionen för att till exempel tillhandahålla "Blad1, Avsnitt A, B".

Se även

tekniska anteckningar efter nummer
tekniska anteckningar efter kategori