Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Den här artikeln beskriver Utskriftsprotokollet för Windows och förklarar hur du skriver ut dokument som innehåller mer än en sida. Artikeln beskriver följande avsnitt:
Utskriftsprotokollet
Om du vill skriva ut ett dokument med flera sidor interagerar ramverket och vyn på följande sätt. Först visar ramverket dialogrutan Skriv ut , skapar en enhetskontext för skrivaren och anropar funktionen StartDoc-medlem för CDC-objektet . För varje sida i dokumentet anropar ramverket sedan startsidans medlemsfunktion CDC för objektet, instruerar visningsobjektet att skriva ut sidan och anropar medlemsfunktionen EndPage . Om skrivarläget måste ändras innan du startar en viss sida anropar vyn ResetDC, som uppdaterar DEVMODE-strukturen som innehåller den nya skrivarlägesinformationen. När hela dokumentet har skrivits ut anropar ramverket medlemsfunktionen EndDoc .
Ersätta funktioner i vyklasser
CView-klassen definierar flera medlemsfunktioner som anropas av ramverket under utskriften. Genom att åsidosätta dessa funktioner i visningsklassen anger du anslutningarna mellan ramverkets utskriftslogik och visningsklassens utskriftslogik. I följande tabell visas dessa medlemsfunktioner.
CViews åsidosättbara funktioner för utskrift
| Namn | Orsak till åsidosättande |
|---|---|
| OnPreparePrinting | Infoga värden i dialogrutan Skriv ut, särskilt längden på dokumentet |
| OnBeginPrinting | Allokera teckensnitt eller andra GDI-resurser |
| OnPrepareDC | Justera attributen för enhetskontexten för en viss sida eller göra paginering vid utskrift |
| OnPrint | Så här skriver du ut en viss sida |
| OnEndPrinting | Frigöra GDI-resurser |
Du kan även utföra utskriftsrelaterad bearbetning i andra funktioner, men dessa funktioner är de som driver utskriftsprocessen.
Följande bild illustrerar de steg som ingår i utskriftsprocessen och visar var var och en av CView's utskriftsmedlemsfunktioner anropas. I resten av den här artikeln beskrivs de flesta av de här stegen mer detaljerat. Ytterligare delar av utskriftsprocessen beskrivs i artikeln Allokera GDI-resurser.
Utskriftsslingan
Paginering
Ramverket lagrar mycket av informationen om ett utskriftsjobb i en CPrintInfo-struktur . Flera av värdena i CPrintInfo gäller sidnumrering. Dessa värden är tillgängliga enligt följande tabell.
Sidnummerinformation som lagras i CPrintInfo
| Medlemsvariabel eller funktionsnamn |
Sidnummer som refereras |
|---|---|
GetMinPage/SetMinPage |
Första sidan i dokumentet |
GetMaxPage/SetMaxPage |
Sista sidan i dokumentet |
GetFromPage |
Första sidan som ska skrivas ut |
GetToPage |
Sista sidan som ska skrivas ut |
m_nCurPage |
Sidan skrivs ut |
Sidnummer börjar på 1, det vill ex. den första sidan är numrerad 1, inte 0. Mer information om dessa och andra medlemmar i CPrintInfo finns i MFC-referensen.
I början av utskriftsprocessen anropar ramverket vyns medlemsfunktion OnPreparePrinting och skickar en pekare till en CPrintInfo struktur. Programguiden innehåller en implementering av OnPreparePrinting som anropar DoPreparePrinting, en annan medlemsfunktion i CView.
DoPreparePrinting är den funktion som visar dialogrutan Skriv ut och skapar en skrivarenhetskontext.
I det här läget vet programmet inte hur många sidor som finns i dokumentet. Den använder standardvärdena 1 och 0xFFFF för numren på den första och sista sidan i dokumentet. Om du vet hur många sidor ditt dokument har, åsidosätter du OnPreparePrinting och anropar [SetMaxPage]--brokenlink--(reference/cprintinfo-class.md#setmaxpage) för CPrintInfo-strukturen innan du skickar den till DoPreparePrinting. På så sätt kan du ange längden på dokumentet.
DoPreparePrinting visar sedan dialogrutan Skriv ut. När den returneras CPrintInfo innehåller strukturen de värden som angetts av användaren. Om användaren bara vill skriva ut ett valt sidintervall kan han eller hon ange sidnumren för start och slut i dialogrutan Skriv ut. Ramverket hämtar dessa värden med hjälp av funktionerna GetFromPage och GetToPage i CPrintInfo. Om användaren inte anger något sidintervall anropar GetMinPage ramverket och GetMaxPage använder de värden som returneras för att skriva ut hela dokumentet.
För varje sida i ett dokument som ska skrivas ut anropar ramverket två medlemsfunktioner i din vyklass, OnPrepareDC och OnPrint, och skickar varje funktion två parametrar: en pekare till ett CDC-objekt och en pekare till en CPrintInfo struktur. Varje gång ramverket anropar OnPrepareDC och OnPrint, skickar det ett annat värde i m_nCurPage medlem av CPrintInfo strukturen. På så sätt meddelar ramverket vyn vilken sida som ska skrivas ut.
Medlemsfunktionen OnPrepareDC används också för skärmvisning. Den gör justeringar i enhetskontexten innan ritningen görs.
OnPrepareDC har en liknande roll vid utskrift, men det finns ett par skillnader: för det första CDC representerar objektet en skrivarenhetskontext i stället för en skärmenhetskontext, och för det andra skickas ett CPrintInfo objekt som en andra parameter. (Den här parametern är NULL när OnPrepareDC den anropas för skärmvisning.) Åsidosätt OnPrepareDC för att göra justeringar i enhetskontexten baserat på vilken sida som skrivs ut. Du kan till exempel flytta visningsportens ursprung och urklippsregionen för att säkerställa att rätt del av dokumentet skrivs ut.
Medlemsfunktionen OnPrint utför den faktiska utskriften av sidan. Artikeln How Default Printing Is Done visar hur ramverket kallar på OnDraw med en skrivarkontext för att utföra utskrift. Mer exakt anropar OnPrint ramverket med en CPrintInfo struktur och en enhetskontext och OnPrint skickar enhetskontexten till OnDraw. Åsidosätt OnPrint för att utföra alla återgivningar som endast ska göras under utskrift och inte för skärmvisning. Om du till exempel vill skriva ut sidhuvuden eller sidfötter (se artikeln Sidhuvuden och sidfötter för mer information). Anropa OnDraw från överskrivningen av OnPrint för att utföra rendering som är gemensam för både skärmvisning och utskrift.
Det faktum att OnDraw gör renderingen för både skärmvisning och utskrift innebär att ditt program är WYSIWYG: "Det du ser är vad du får." Anta dock att du inte skriver ett WYSIWYG-program. Tänk dig till exempel en textredigerare som använder ett fetstilt teckensnitt för utskrift men som visar kontrollkoder för att ange fet text på skärmen. I en sådan situation använder OnDraw du strikt för skärmvisning. När du åsidosätter OnPrintersätter du anropet med OnDraw ett anrop till en separat ritningsfunktion. Den funktionen ritar dokumentet så som det visas på papper med hjälp av de attribut som du inte visar på skärmen.
Skrivarsidor jämfört med dokumentsidor
När du refererar till sidnummer är det ibland nödvändigt att skilja mellan skrivarens koncept för en sida och ett dokuments koncept för en sida. Ur skrivarens synvinkel är en sida ett pappersark. Ett pappersark är dock inte nödvändigtvis lika med en sida i dokumentet. Om du till exempel skriver ut ett nyhetsbrev, där bladen ska vikas, kan ett pappersark innehålla både de första och sista sidorna i dokumentet, sida vid sida. På samma sätt, om du skriver ut ett kalkylblad, består dokumentet inte av sidor alls. I stället kan ett pappersark innehålla raderna 1 till 20, kolumnerna 6 till och med 10.
Alla sidnummer i CPrintInfo-strukturen refererar till skrivarsidor. Ramverket anropar OnPrepareDC och OnPrint en gång för varje pappersark som passerar genom skrivaren. När du åsidosätter funktionen OnPreparePrinting för att ange dokumentets längd måste du använda skrivarsidor. Om det finns en en-till-en-korrespondens (dvs. en skrivarsida är lika med en dokumentsida) är det enkelt. Om dokumentsidor och skrivarsidor däremot inte motsvarar varandra direkt måste du översätta mellan dem. Överväg till exempel att skriva ut ett kalkylblad. När du åsidosätter OnPreparePrinting, måste du beräkna hur många pappersark som krävs för att skriva ut hela kalkylbladet och sedan använda det värdet när du anropar SetMaxPage medlemsfunktionen för CPrintInfo. När du åsidosätter OnPrepareDCmåste du på samma sätt översätta m_nCurPage till det intervall med rader och kolumner som visas på just det bladet och sedan justera visningsportens ursprung i enlighet med detta.
Print-Time paginering
I vissa situationer kanske din visningsklass inte vet i förväg hur lång tid dokumentet är förrän det faktiskt har skrivits ut. Anta till exempel att ditt program inte är WYSIWYG, så ett dokuments längd på skärmen motsvarar inte dess längd när det skrivs ut.
Detta orsakar ett problem när du åsidosätter OnPreparePrinting för visningsklassen: du kan inte skicka ett värde till SetMaxPage funktionen i CPrintInfo-strukturen eftersom du inte vet längden på ett dokument. Om användaren inte anger ett sidnummer som ska stoppas med hjälp av dialogrutan Skriv ut vet ramverket inte när utskriftsloopen ska stoppas. Det enda sättet att avgöra när du ska stoppa utskriftsloopen är att skriva ut dokumentet och se när det slutar. Visningsklassen måste söka efter slutet av dokumentet medan det skrivs ut och sedan informera ramverket när slutet har nåtts.
Ramverket förlitar sig på visningsklassens OnPrepareDC-funktion för att tala om för den när den ska stoppas. Efter varje anrop till OnPrepareDCkontrollerar ramverket en medlem i CPrintInfo strukturen som kallas m_bContinuePrinting. Standardvärdet är TRUE. Så länge det är så fortsätter ramverket utskriftsloopen. Om det är inställt på FALSE stoppas ramverket. För att utföra paginering vid utskriftstid, åsidosätt OnPrepareDC för att kontrollera om slutet av dokumentet har nåtts, och ange m_bContinuePrinting till FALSE när det har nåtts.
Standardimplementeringen av OnPrepareDC ställer in m_bContinuePrinting till värdet FALSE om den aktuella sidan är större än 1. Det innebär att om dokumentets längd inte har angetts förutsätter ramverket att dokumentet är en sidlångt. En konsekvens av detta är att du måste vara försiktig om du anropar basklassversionen av OnPrepareDC. Anta inte att m_bContinuePrinting är TRUE när du har anropat basklassversionen.