Mehrseitige Dokumente
In diesem Artikel wird das Protokoll Windows beschrieben, und es wird beschrieben, wie Dokumente drucken, die mehr als eine Seite enthalten.Der Artikel enthält die folgenden Themen:
Protokoll drucken
Überschreiben von Funktionen Ansichtsklassen
Paginierung
Seiten Drucker.Seiten Dokumenten
PRINT-TIME-Paginierung
Das Drucks-Protokoll
So fügen Sie ein mehrseitiges Dokument, das Framework anzeigen und drucken interaktiv in der folgenden Weise.Zuerst wird das Framework das Drucken Dialogfeld erstellt einen Gerätekontext für den Drucker und ruft die StartDocCDC-Memberfunktion des Objekts auf.Dann jede Seite des Dokuments, fordert das Framework die StartPage-Memberfunktion des Objekts CDC, weist das Ansichtsobjekt auf, um die Seite gedruckt werden soll und ruft die EndPage-Memberfunktion auf.Wenn der Drucker Modus geändert werden muss, bevor eine bestimmte Seite startet, ruft die Ansicht ResetDC an, die die DEVMODE-Struktur aktualisiert, die die neuen Modus Drucker.Wenn das gesamte Dokument gedruckt wurde, ruft das Framework die EndDoc-Memberfunktion auf.
Überschreiben von Ansichtsklassen-Funktionen
Die CView-Klasse definiert eine Reihe von Memberfunktionen, die vom Framework während des Drucks aufgerufen werden.Mit diesen Funktionen in der Ansichtsklasse überschreiben, stellen Sie die Verbindungen zwischen der Logik zu druckenden Logik des Frameworks anzeigen und die Klasse bereit.In der folgenden Tabelle sind diese Memberfunktion auf.
CViews schreibbare Funktionen zum Drucken
Name |
Grund für das Überschreiben |
---|---|
So fügen Sie Werte im Dialogfeld Drucken einfügen, insbesondere die Länge des Dokuments |
|
So ordnen Sie GDI-Betriebsmittel oder andere Schriftarten |
|
So fügen Sie Attribute des Gerätekontext auf eine bestimmte Seite anpassen, oder führen TIME-Paginierung PRINT |
|
Um eine bestimmte Seite drucken |
|
So verwenden GDI-Betriebsmittel |
Sie können auch andere Funktionen in Druck-verknüpftes Verarbeitung möglich, aber diese Funktionen sind, die den Druckvorgang steuern.
Die folgende Abbildung zeigt die Schritte, die am Druckvorgang beteiligt sind, und zeigt, wo die einzelnen Druckmemberfunktionen von CView aufgerufen werden.Der Rest dieses Artikels werden die meisten dieser Schritte ausführlicher beschrieben.Zusatzteile des Druckvorgangs werden im Artikel Zuordnen GDI-Betriebsmittel beschrieben.
Druckschleife
Paginierung
Das Framework speichert einen Großteil der Informationen über einen Druckauftrag in einer CPrintInfo-Struktur.Mehrere der Werte in CPrintInfo Paginierung beziehen. Diese Werte sind die in der folgenden Tabelle dargestellt zugegriffen werden.
Seitenzahl-Informationen in CPrintInfo
Membervariable oder Funktionsname |
Seitenzahl, auf das verwiesen wird |
---|---|
GetMinPage/SetMinPage |
Die erste Seite des Dokuments |
GetMaxPage/SetMaxPage |
Die letzte Seite des Dokuments |
GetFromPage |
Erste zu druckende Seite |
GetToPage |
Gedruckt werden letzten Seite |
m_nCurPage |
Seite, die gerade gedruckt werden soll |
Seitenzahlen beginnen mit 1, das heißt ist die erste Seite 1, nicht 0 nummeriert.Weitere Informationen über diese und andere Member von CPrintInfo finden Sie in der MFC-Referenz.
Zu Beginn des Druckvorgangs ruft das Framework die OnPreparePrinting-Memberfunktion der Ansicht auf und übergibt einen Zeiger auf eine CPrintInfo-Struktur.Der Anwendungs-Assistent stellt eine Implementierung von OnPreparePrinting, die DoPreparePrinting aufruft, eine andere Memberfunktion von CView bereit.DoPreparePrinting ist die Funktion, die das Dialogfeld Drucken darstellt und einen Druckergerätekontext erstellt.
Zu diesem Zeitpunkt weiß der Anwendung nicht, wie viele Seiten im Dokument befinden.Sie verwendet die Standardwerte 1 und 0xFFFF für die Anzahlen von der erste und letzte Seite des Dokuments.Wenn Sie wissen, wie viele Seiten im Dokument wurde, überschreiben Sie OnPreparePrinting und Aufruf SetMaxPage für die CPrintInfo-Struktur, bevor Sie sie für DoPreparePrinting senden.Auf diese Weise können Sie die Länge des Dokuments angeben.
DoPreparePrinting wird das Dialogfeld Drucken an.Bei der Rückgabe enthält die CPrintInfo-Struktur Werte, die vom Benutzer angegeben werden.Wenn der Benutzer nur ein ausgewählter Seitenbereich ausgeben möchte, oder er kann den Start- und Endwert seitenzahlen im Dialogfeld Drucken an.Das Framework ruft diese Werte mithilfe der GetFromPage und GetToPage-Funktionen von CPrintInfo ab.Wenn der Benutzer nicht über einen Seitenbereich angegeben wird, ruft das Framework GetMinPage und GetMaxPage und mithilfe der Werte, die zurückgegeben werden, um das gesamte Dokument gedruckt werden.
Für jede Seite in einem zu druckenden Dokuments, ruft das Framework zweiköpfige Funktionen in der Ansichtsklasse, in OnPrepareDC und OnPrint einzelnen Parameter an und führt zwei Funktionen aus: Ein Zeiger auf einen CDC-Objekt und ein Zeiger auf eine CPrintInfo-Struktur.Jedes Mal, wenn das Framework OnPrepareDC und OnPrint aufruft, übergibt er einen anderen Wert im m_nCurPage-Member der CPrintInfo-Struktur.Auf diese Weise wird das Framework der Ansicht mit, welche Seite gedruckt werden soll.
Die OnPrepareDC-Memberfunktion wird auch für die Bildschirmanzeige verwendet.Sie nimmt Anpassungen auf den Gerätekontext vor, bevor das Zeichnen stattfindet.OnPrepareDC dient eine ähnliche Rolle im Drucken, aber es gibt ein paar Unterschiede: CDC-Objekt stellt das zuerst einen Druckergerätekontext anstelle eines Bildschirm-Gerätekontexts dar, und Sekunde, wird ein CPrintInfo-Objekt als zweiter Parameter übergeben.(Dieser Parameter ist NULL, wenn OnPrepareDC für die Bildschirmanzeige) aufgerufen wird. Überschreiben Sie OnPrepareDC, um Anpassungen auf den Gerätekontext vorzunehmen, basierend auf der Seite gedruckt wird.Sie können beispielsweise den Viewport ursprung und den Clippingbereich verschieben, um sicherzustellen, dass der entsprechende Teil des Dokuments gedruckt wird.
Die OnPrint-Memberfunktion führt den eigentlichen Drucken der Seite aus.Der Artikel Wie Sie davon ausgehen den Standardwert ist Belastung ausgeführt zeigt, wie das Framework OnDraw mit einem Druckergerätekontext aufruft, um Belastungs- auszuführen.Genau, ruft das Framework OnPrint mit einer CPrintInfo-Struktur und einen Gerätekontext und OnPrint führt den Gerätekontext zu OnDraw.Überschreiben Sie OnPrint, um jedes Rendern auszuführen, das nur während des Drucks und nicht für die Bildschirmanzeige erfolgen soll.Zum Beispiel Kopf- oder Fußzeilen (Drucken finden Sie im Artikel Kopf- und Fußzeilen ) weitere Informationen.Dann rufen Sie OnDraw in der Überschreibung von OnPrint, um das Rendering für die Bildschirmanzeige, und zum Drucken verwenden.
Die Tatsache, dass OnDraw das Rendering für Bildschirmanzeige und Ablegen der Fall ist, bedeutet, dass die Anwendung WYSIWYG ist: "What You See Is What You Get". Es wird angenommen, dass Sie keine WYSIWYG-Anwendung schreiben.Betrachten Sie z. B. einen Text-Editor, der eine fett formatierten Schriftart verwendet, sodass das Drucken steuerungscodes Anzeige jedoch fett formatiertem Text auf dem Bildschirm angeben.In einer solchen Situation verwenden Sie OnDraw ausschließlich für die Bildschirmanzeige.Wenn Sie OnPrint überschreiben, ersetzen Sie den Aufruf von OnDraw mit einem separaten Aufruf einer Funktion zum Zeichnen.Diese Funktion das Dokument angezeigt wird, zeichnet sich die Methode auf Papier mit den Attributen, die Sie nicht auf dem Bildschirm angezeigt werden.
Drucker-Seiten mit einer Gegensignatur.Dokumenten-Seiten
Wenn Sie Seitenzahlen verweisen, zur Unterscheidung ist manchmal erforderlich, zwischen dem Konzept des Druckers einer Seite und dem Konzept eines Dokuments einer Seite.Nach der Ansicht des Druckers ist eine Seite ein Blatt Papier.Blatt Papier entspricht jedoch nicht unbedingt auf einer Seite des Dokuments.Wenn Sie beispielsweise einen Newsletter drucken kann, in dem die Blätter gefaltet werden sollen, ein Blatt Papier der ersten und letzten Seiten des Dokuments, nebeneinander enthielten.Auch wenn Sie ein Arbeitsblatt gedruckt besteht aus Seiten des Dokuments nicht vorhanden.Stattdessen enthält möglicherweise ein Blatt Papier Zeilen 1 bis 20, Spalte 6 bis 10.
Alle Seitenzahlen in der CPrintInfo-Struktur verweisen auf Drucker vonseiten an.Das Framework ruft OnPrepareDC und OnPrint einmal für jedes Blatt Papier an, das vom Drucker durchläuft.Wenn Sie die OnPreparePrinting-Funktion überschreiben, um die Länge des Dokuments anzugeben, müssen Sie Seiten Drucker verwenden.Wenn eine 1:1 Entsprechung (d. h. eine Seite Druckern entspricht einer Dokumentseite) gibt, dann ist dies ein einfacher Vorgang.Wenn andererseits Seiten Dokumente und Seiten Drucker nicht direkt entsprechen, müssen Sie zwischen ihnen übersetzen.Beispielsweise sollten Sie ein Arbeitsblatt gedruckt werden.Wenn Sie OnPreparePrinting überschreiben, müssen Sie berechnen, wie viele Blätter Papier erforderlich sind, um das gesamte Arbeitsblatt gedruckt und diesen Wert dann verwenden, wenn sie die SetMaxPageCPrintInfo von Memberfunktionen aufrufen.Auch wenn Sie OnPrepareDC überschreiben, müssen Sie m_nCurPage in den Bereich von Zeilen und Spalten übersetzt werden, die für diesen speziellen Arbeitsblatt angezeigt und dann den Viewport ursprung entsprechend anpassen.
PRINT-TIME-Paginierung
In einigen Situationen weiß die Ansichtsklasse möglicherweise nicht im Voraus, wie lange sich das Dokument befindet, bis sie tatsächlich gedruckt wurde.Angenommen, die Anwendung keine WYSIWYG ist, sodass die Länge des Dokuments auf dem Bildschirm nicht auf seine Länge entspricht, wenn es gedruckt wird.
Dies verursacht ein Problem, wenn Sie OnPreparePrinting für die Ansichtsklasse überschreiben: Sie können einen Wert zur SetMaxPage-Funktion der CPrintInfo-Struktur übergeben, da Sie nicht die Länge eines Dokuments bekannt ist.Wenn der Benutzer keine Seitenzahl angeben, um eine Verbindung mit der Anwendung des Felds Druckdialogfeld beenden, weiß das Framework nicht, wann das Drucken - Schleife beendet.Die einzige Möglichkeit festzustellen, wann die Schleife Drucken darstellt, dieses Dokument auszudrucken und endet, wenn sie beendet wird.Die Ansichtsklasse muss zum Ende des Dokuments überprüfen, während es gedruckt wird. Das Framework dann mitteilen, wenn das Ende erreicht ist.
Das Framework basiert auf OnPrepareDC-Klasse Ansicht der Funktion, um sie anzuzeigen, in welchen Fällen angehalten wird.Nach jeder Aufruf von OnPrepareDC, das Framework ein Mitglied der CPrintInfo-Struktur überprüft, die m_bContinuePrinting aufgerufen wird.Der Standardwert ist TRUE. Solange dies so bleibt, wird das Framework die Druck- - Schleife fort.Wenn es FALSE festgelegt ist, wird das Framework auf.So überschreiben, TIME-Paginierung PRINT, um OnPrepareDC, ob das Ende des Dokuments erreicht wurde, und führen zu FALSE Satz m_bContinuePrinting zu überprüfen, ob er hat.
Die Standardimplementierung von OnPrepareDC legt diesen fest FALSE zu m_bContinuePrinting, wenn die aktuelle Seite größer als 1 ist.Dies bedeutet, dass, wenn die Länge des Dokuments nicht angegeben wurde, das Framework davon ausgegangen wird, dass das Dokument eine Seite lang ist.Eine Folge hierfür ist, dass Sie vorsichtig vorgehen müssen, wenn Sie die Basisklassenversion von OnPrepareDC aufrufen.Gehen Sie nicht davon aus, dass m_bContinuePrintingTRUE ist, nachdem Sie die Basisklassenversion aufgerufen haben.