TN030: Anpassen des Druckvorgangs und der Druckvorschau
Hinweis
Der folgende technische Hinweis wurde seit dem ersten Erscheinen in der Onlinedokumentation nicht aktualisiert. Daher können einige Verfahren und Themen veraltet oder falsch sein. Um aktuelle Informationen zu erhalten, wird empfohlen, das gewünschte Thema im Index der Onlinedokumentation zu suchen.
In diesem Hinweis wird der Prozess zum Anpassen der Druck- und Druckvorschau beschrieben und die Zwecke der Rückrufroutinen beschrieben, die in CView
und den Rückrufroutinen und Memberfunktionen von CPreviewView
.
Problemstellung
MFC bietet eine vollständige Lösung für die meisten Druck- und Druckvorschauanforderungen. In den meisten Fällen ist wenig zusätzlicher Code erforderlich, damit eine Ansicht gedruckt und in der Vorschau angezeigt werden kann. Es gibt jedoch Möglichkeiten, das Drucken zu optimieren, die erhebliche Anstrengungen im Rahmen des Entwicklers erfordern, und einige Anwendungen müssen dem Druckvorschaumodus bestimmte Benutzeroberflächenelemente hinzufügen.
Effizientes Drucken
Wenn eine MFC-Anwendung mit den Standardmethoden druckt, leitet Windows alle GDI-Ausgabeaufrufe (Graphic Device Interface) an eine In-Memory-Metadatei weiter. Wenn EndPage
sie aufgerufen wird, gibt Windows die Metadatei einmal für jedes physische Band wieder, das der Drucker zum Drucken einer Seite benötigt. Während dieses Renderings fragt GDI häufig die Abort-Prozedur ab, um festzustellen, ob sie fortgesetzt werden soll. In der Regel ermöglicht die Abbruchprozedur die Verarbeitung von Nachrichten, sodass der Benutzer den Druckauftrag mithilfe eines Druckdialogfelds abbrechen kann.
Leider kann dies den Druckvorgang verlangsamen. Wenn der Druck in Ihrer Anwendung schneller sein muss, als mit der Standardtechnik erreicht werden kann, müssen Sie manuelles Banden implementieren.
Druckband
Um manuell zu banden, müssen Sie die Druckschleife so implementieren, dass sie OnPrint
mehrmals pro Seite (einmal pro Band) aufgerufen wird. Die Druckschleife wird in der OnFilePrint
Funktion in viewprnt.cpp implementiert. In ihrer CView
abgeleiteten Klasse überladen Sie diese Funktion so, dass der Nachrichtenzuordnungseintrag zum Behandeln des Druckbefehls Ihre Druckfunktion aufruft. Kopieren Sie die OnFilePrint
Routine, und ändern Sie die Druckschleife, um banding zu implementieren. Wahrscheinlich möchten Sie auch das Bandrechteck an Ihre Druckfunktionen übergeben, damit Sie die Zeichnung basierend auf dem zu druckenden Bereich optimieren können.
Zweitens müssen Sie beim Zeichnen des Bandes häufig anrufen QueryAbort
. Andernfalls wird die Abort-Prozedur nicht aufgerufen, und der Benutzer kann den Druckauftrag nicht abbrechen.
Seitenansicht: Elektronisches Papier mit Benutzeroberfläche
Die Seitenansicht versucht im Wesentlichen, die Anzeige in eine Emulation eines Druckers umzuwandeln. Standardmäßig wird der Clientbereich des Standard Fensters verwendet, um eine oder zwei Seiten vollständig im Fenster anzuzeigen. Der Benutzer kann einen Bereich der Seite vergrößern, um ihn ausführlicher anzuzeigen. Mit zusätzlicher Unterstützung kann der Benutzer das Dokument möglicherweise sogar im Vorschaumodus bearbeiten.
Anpassen der Seitenansicht
Dieser Hinweis befasst sich nur mit einem Aspekt beim Ändern der Seitenansicht: Hinzufügen der Benutzeroberfläche zum Vorschaumodus. Andere Änderungen sind möglich, aber solche Änderungen liegen außerhalb dieses Diskussionsbereichs.
So fügen Sie dem Vorschaumodus eine Benutzeroberfläche hinzu
Leiten Sie eine Ansichtsklasse von
CPreviewView
.Fügen Sie Befehlshandler für die gewünschten UI-Aspekte hinzu.
Wenn Sie der Anzeige visuelle Aspekte hinzufügen, überschreiben
OnDraw
Sie die Zeichnung, und führen Sie sie nach dem AufrufenCPreviewView::OnDraw
aus.
OnFilePrintPreview
Dies ist der Befehlshandler für die Seitenansicht. Die Standardimplementierung lautet:
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
blendet den Standard Bereich der Anwendung aus. Steuerleisten, z. B. die Statusleiste, können beibehalten werden, indem sie im pState-dwStates-Element> angegeben werden (Dies ist eine Bitmaske und die Bits für einzelne Steuerleisten werden durch AFX_CONTROLBAR_MASK( AFX_IDW_MYBAR)) definiert). Das Fenster "pState-nIDMainPane>" ist das Fenster, das automatisch ausgeblendet und erneut angezeigt wird. DoPrintPreview
erstellt dann eine Schaltflächenleiste für die standardmäßige Vorschau-Benutzeroberfläche. Wenn eine spezielle Fensterbehandlung erforderlich ist, z. B. zum Ausblenden oder Anzeigen anderer Fenster, sollte dies erfolgen, bevor DoPrintPreview
sie aufgerufen wird.
Wenn die Seitenansicht abgeschlossen ist, werden die Steuerelementleisten standardmäßig in den ursprünglichen Zustand und im bereich Standard angezeigt. Wenn eine spezielle Behandlung erforderlich ist, sollte sie in einer Außerkraftsetzung von EndPrintPreview
. Wenn DoPrintPreview
ein Fehler auftritt, stellen Sie auch eine spezielle Behandlung bereit.
DoPrintPreview wird mit:
Die Ressourcen-ID der Dialogfeldvorlage für die Vorschausymbolleiste.
Ein Zeiger auf die Ansicht, um den Druck für die Druckvorschau auszuführen.
Die Laufzeitklasse der Vorschauansichtsklasse. Dies wird dynamisch in DoPrintPreview erstellt.
Der CPrintPreviewState-Zeiger. Beachten Sie, dass die CPrintPreviewState-Struktur (oder die abgeleitete Struktur, wenn die Anwendung mehr Zustand beibehalten muss) nicht im Frame erstellt werden darf. DoPrintPreview ist moduslos und diese Struktur muss überleben, bis EndPrintPreview aufgerufen wird.
Hinweis
Wenn für die Druckunterstützung eine separate Ansichts- oder Ansichtsklasse erforderlich ist, sollte ein Zeiger auf dieses Objekt als zweiter Parameter übergeben werden.
EndPrintPreview
Dies wird aufgerufen, um den Druckvorschaumodus zu beenden. Es ist häufig wünschenswert, zur Seite im Dokument zu wechseln, die zuletzt in der Seitenansicht angezeigt wurde. EndPrintPreview
ist die Chance, dies zu tun. Das Element "pInfo-m_nCurPage>" ist die Seite, die zuletzt angezeigt wurde (ganz links, wenn zwei Seiten angezeigt wurden), und der Zeiger ist ein Hinweis darauf, wo auf der Seite der Benutzer interessiert war. Da die Struktur der Ansicht der Anwendung für das Framework unbekannt ist, müssen Sie den Code angeben, um zum ausgewählten Punkt zu wechseln.
Sie sollten die meisten Aktionen vor dem Aufrufen CView::EndPrintPreview
ausführen. Mit diesem Aufruf werden die Auswirkungen von DoPrintPreview
pView, pDC und pInfo rückgängig gemacht und gelöscht.
// Any further cleanup should be done here.
CView::EndPrintPreview(pDC, pInfo, point, pView);
CWinApp::OnFilePrintSetup
Dies muss für das Menüelement "Druckeinrichtung" zugeordnet werden. In den meisten Fällen ist es nicht erforderlich, die Implementierung außer Kraft zu setzen.
Seitenklatur
Ein weiteres Problem ist die Seitennummerierung und Reihenfolge. Bei einfachen Textverarbeitungstypanwendungen ist dies ein einfaches Problem. Die meisten Druckvorschausysteme gehen davon aus, dass jede gedruckte Seite einer Seite im Dokument entspricht.
Bei dem Versuch, eine generalisierte Lösung bereitzustellen, gibt es mehrere Dinge zu berücksichtigen. Stellen Sie sich ein CAD-System vor. Der Benutzer verfügt über eine Zeichnung, die mehrere E-Size-Blätter abdeckt. Bei einem E-Size-Plotter (oder einem kleineren, skalierten) Plotter wäre die Seitennummerierung wie im einfachen Fall. Aber auf einem Laserdrucker, Drucken von 16 A-Seiten pro Blatt, was die Seitenvorschau als "Seite" betrachtet
Wie der Einführungsabsatz zugibt, verhält sich die Seitenansicht wie ein Drucker. Daher wird dem Benutzer angezeigt, was aus dem ausgewählten Drucker kommen würde. Es liegt an der Ansicht, zu bestimmen, welches Bild auf jeder Seite gedruckt wird.
Die Seitenbeschreibungszeichenfolge in der CPrintInfo
Struktur stellt ein Mittel zum Anzeigen der Seitenzahl für den Benutzer bereit, wenn sie als eine Zahl pro Seite dargestellt werden kann (wie in "Seite 1" oder "Seiten 1-2"). Diese Zeichenfolge wird von der Standardimplementierung von CPreviewView::OnDisplayPageNumber
. Wenn eine andere Anzeige erforderlich ist, kann eine diese virtuelle Funktion außer Kraft setzen, um z. B. "Sheet1, Sections A, B" bereitzustellen.
Siehe auch
Technische Hinweise – nach Nummern geordnet
Technische Hinweise – nach Kategorien geordnet