Freigeben über


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.

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 CViewabgeleiteten 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.

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

  1. Leiten Sie eine Ansichtsklasse von CPreviewView.

  2. Fügen Sie Befehlshandler für die gewünschten UI-Aspekte hinzu.

  3. Wenn Sie der Anzeige visuelle Aspekte hinzufügen, überschreiben OnDraw Sie die Zeichnung, und führen Sie sie nach dem Aufrufen CPreviewView::OnDrawaus.

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
    }
}

DoPrintPreviewblendet 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::EndPrintPreviewausfü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