Diese Mitteilung beschreibt den Prozess der Anpassung von Drucken und Druckvorschau und beschreibt die Zwecke der Callback-Routinen in der CView und die Callback-Routinen und Memberfunktionen von CPreviewView.
Das Problem
MFC bietet eine vollständige Lösung für die meisten drucken und Seitenansicht benötigt. In den meisten Fällen ist wenig zusätzlicher Code benötigt, um eine Ansicht zu drucken und Vorschau. Allerdings gibt es Möglichkeiten zum Drucken optimieren, die erfordern erhebliche Anstrengungen seitens der Entwickler, und einige Anwendungen müssen bestimmte Elemente der Benutzeroberfläche in der Seitenansicht-Modus hinzufügen.
Effizientes Drucken
Wenn eine MFC-Anwendung mit Standardmethoden druckt, leitet Windows alle Graphical Device Interface (GDI) Ausgabe Aufrufe eine speicherinterne-Metafile. Wenn EndPage aufgerufen wird, spielt Windows Metafile einmal für jedes physische Band, die der Drucker erfordert, um eine Seite zu drucken. Während diese Darstellung fragt GDI häufig die Prozedur Abbrechen um festzustellen, ob es fortgesetzt werden soll. In der Regel ermöglicht der Prozedur abbrechen Nachrichten verarbeitet werden, so dass der Benutzer den Druckauftrag ein Drucken-Dialogfeld mit abbrechen kann.
Leider kann dies den Druckvorgang verlangsamen. Wenn der Druck in der Anwendung schneller sein muss als mit der Standardtechnik erreicht werden können, müssen Sie manuelle Streifenbildung implementieren.
Drucken Streifenbildung
Um manuell band, müssen Sie wieder die Druckschleife implementieren so dass OnPrint mehrmals pro Seite (einmal pro Band) aufgerufen wird. Die Druckschleife ist in der OnFilePrint -Funktion in viewprnt.cpp implementiert. In Ihrer CView-abgeleitete Klasse, Sie diese Funktion überladen, sodass der Nachricht Zuordnungseintrag für den Umgang mit des Befehls print print Funktion aufruft. Kopieren Sie die OnFilePrint -Routine, und ändern Sie die Druckschleife um Streifenbildung zu implementieren. Sie werden wahrscheinlich wollen auch das Streifenbildung Rechteck um Ihre Druckfunktionen übergeben, so dass Sie können optimieren Zeichnung basierend auf den Abschnitt der Seite wird gedruckt.
Zweitens müssen Sie beim Zeichnen der Band häufig QueryAbort aufrufen. Ansonsten die Prozedur Abbrechen wird nicht aufgerufen und der Benutzer werden nicht in der Lage, den Druckauftrag abbrechen.
Print Preview: &Nbsp; Elektronisches Papier mit Benutzeroberfläche
Druckvorschau, im wesentlichen versucht, die Anzeige in eine Emulation eines Druckers aktivieren. Standardmäßig wird der Clientbereich des Hauptfensters verwendet, um eine oder zwei Seiten vollständig innerhalb des Fensters angezeigt. Der Benutzer ist in der Lage, auf einer Fläche von der Seite, um es im Detail finden Sie unter vergrößern. Mit zusätzlicher Unterstützung der Benutzer selbst darf das Dokument im Vorschaumodus bearbeiten.
Seitenansicht anpassen
Diesem Hinweis befasst sich nur mit einem Aspekt der Seitenansicht ändern: Hinzufügen von Benutzeroberfläche, Vorschau-Modus. Andere Änderungen sind möglich, aber solche Änderungen sind den Rahmen dieser Diskussion.
Kurz gesagt, ist der Prozess des Hinzufügens UI in den Vorschaumodus zu:
OnFilePrintPreview
Dies ist den Command-Ereignishandler für die Seitenansicht. Die Standardimplementierung ist:
void CView::OnFilePrintPreview()
{
&Nbsp; / / In abgeleiteten Klassen implementieren spezielle Fenster behandeln hier
/ / Müssen Sie loshaken Rahmenfenster schließen wenn verknüpft.
/ / muss dies nicht auf dem Rahmen erstellen. Diese Funktion muss überleben werden.
CPrintPreviewState * pState = neue CPrintPreviewState;
If (!.DoPrintPreview (AFX_IDD_PREVIEW_TOOLBAR, diese,
RUNTIME_CLASS(CPreviewView), pState))
{
/ / In abgeleiteten Klassen reverse spezielle Fenster Behandlung
/ / hier für Vorschau Fehlerfall
TRACE0 ("Fehler: DoPrintPreview fehlgeschlagen");
AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
Löschen Sie pState; / / Vorschau konnte nicht initialisiert werden, / / Status jetzt löschen
}
}
DoPrintPreview wird das Hauptfenster der Anwendung verstecken. Steuerleisten, können z. B. die Statusleiste, indem Sie sie in die pState-Gt angeben aufbewahrt werden;DwStates Mitglied (Dies ist eine Bit-Maske und die Bits, für einzelne Steuerleisten durch AFX_CONTROLBAR_MASK(AFX_IDW_MYBAR) definiert sind). Das Fenster pState - >nIDMainPane ist das Fenster, das automatisch ausgeblendet und reshown werden. DoPrintPreview wird dann eine Symbolleiste für die Standardbenutzeroberfläche Vorschau erstellen. Wenn spezielle Fenster Behandlung benötigt wird, heißt z.B. an ausblenden oder Anzeigen von anderen Fenstern, die vor dem DoPrintPreview erfolgen sollte.
Standardmäßig Wenn Seitenansicht abgeschlossen ist, gibt es die Steuerleisten ihre ursprünglichen Zustände und im Hauptbereich sichtbar. Wenn besondere Behandlung erforderlich ist, sollte es in einer Überschreibung der EndPrintPreview. Wenn DoPrintPreview ausfällt, bieten Sie auch besondere Behandlung.
DoPrintPreview wird mit bezeichnet.:
Hinweis&Nbsp; Wenn eine separate Ansicht oder Ansichtsklasse für Druckunterstützung benötigt wird, sollte ein Zeiger auf das Objekt als zweiter Parameter übergeben werden.
EndPrintPreview
Dies wird bezeichnet, um den Seitenansicht-Modus zu beenden. Es ist oft wünschenswert, um die Seite in das Dokument verschieben, die zuletzt in der Seitenansicht angezeigt wurde. EndPrintPreview ist die Anwendung der Chance, das zu tun. PInfo-≫M_nCurPage -Member ist, dass die Seite, die zuletzt angezeigt (ganz links, wenn zwei Seiten angezeigt wurden), und der Zeiger ist ein Hinweis, wo der Benutzer auf der Seite interessiert war. Da die Struktur der Anwendung Ansicht zum Framework unbekannt ist, müssen Sie den Code zum ausgewählten Punkt verschoben bereitstellen.
Sie sollten die meisten Aktionen vor dem Aufruf von CView::EndPrintPreview. Dieser Aufruf kehrt die Auswirkungen der DoPrintPreview und löscht pView, pDC und pInfo.
/ / Jede weitere Bereinigung hier getan werden sollte.
CView::EndPrintPreview (pDC, pInfo, Point, pView)
CWinApp::OnFilePrintSetup
Dies muss für die Druckereinrichtung-Menüelement zugeordnet werden. In den meisten Fällen ist es nicht notwendig, die Implementierung überschreiben.
Seite Nomenklatur
Ein weiteres Problem ist die Seitennummerierung und Reihenfolge. Für einfache Textverarbeitung Anwendungen ist dies eine einfache Frage. Die meisten Systeme in Seitenansicht davon ausgehen, dass jeder gedruckten Seite einer Seite im Dokument entspricht.
Bei dem Versuch, eine verallgemeinerte Lösung bieten, gibt es einige Dinge zu beachten. Stellen Sie sich ein CAD-System. Der Benutzer hat eine Zeichnung, die mehrere Blätter in E-Größe umfasst. Auf einer E-Größe (oder eine kleinere, skaliert) Plotter, Seitennummerierung als im einfachen Fall wäre. Aber auf einem Laserdrucker, Drucken von 16 A-Größe Seiten pro Blatt, was Seitenansicht hält eine "Seite"?
Wie der einführende Absatz heißt agiert Print Preview wie ein Drucker. Daher wird dem Benutzer angezeigt, was von den bestimmten Drucker kommen würde, das ausgewählt ist. Es ist bis zu der Ansicht zu bestimmen, welches Bild auf jeder Seite gedruckt wird.
Die Seite Beschreibung String in der CPrintInfo -Struktur bietet eine Möglichkeit, die Seitenzahl für den Benutzer anzuzeigen, wenn es als eine Nummer pro Seite (wie in "Page 1" oder "Seiten 1-2") dargestellt werden kann. Diese Zeichenfolge wird von der Standardimplementierung der CPreviewView::OnDisplayPageNumberverwendet. Wenn eine andere Anzeige erforderlich ist, kann eine dieser virtuellen Funktion bereitzustellen, beispielsweise "Tabelle1, Abschnitte A, B" überschreiben.
Technische Hinweise von &Nummer |nbsp; Technische Hinweise nach Kategorie