Documenti a più pagine
In questo articolo vengono descritte le finestre che stampa il protocollo e viene illustrato come stampare documenti che contengono più pagine.Articolo vengono trattati i seguenti argomenti:
Protocollo di stampa
Eseguire l'override delle funzioni della classe di visualizzazione
Paginazione
Pagine della stampante supagine di documento
Paginazione di tempo di stampa
Il protocollo di stampa
Per stampare un documento a più pagine, il framework e visualizzazione interattivi nel modo seguente.Innanzitutto il framework di visualizzare la finestra di dialogo di Stampa , crea un contesto di dispositivo per la stampante e chiama la funzione membro di StartDoc dell'oggetto di CDC .Quindi, ogni pagina del documento, il framework richiede la funzione membro di StartPage dell'oggetto di CDC , indica l'oggetto visualizzato per stampare la pagina e chiama la funzione membro di EndPage .Se la stampante che la modalità deve essere modificata prima che fase di avvio di una pagina particolare, la visualizzazione chiama ResetDC, che aggiorna la struttura di DEVMODE che contiene le nuove informazioni di sistema della stampante.Se l'intero documento è stato formattato, il framework chiama la funzione membro di EndDoc .
Eseguire l'override delle funzioni della classe di visualizzazione
La classe di CView definisce diverse funzioni membro definite dal framework durante la stampa.Eseguendo l'override di queste funzioni nella classe di visualizzazione, immettere le connessioni tra la logica di stampa del framework e la logica di visualizzazione di stampa della classe.Nella tabella seguente sono elencate le funzioni membro.
Le funzioni sottoponibili a override di modello CView per stampare
Nome |
Motivo per eseguire l'override |
---|---|
Per inserire i valori nella finestra di dialogo stampa, in particolare la lunghezza del documento |
|
Per allocare i tipi di carattere o altre risorse GDI |
|
Per modificare gli attributi del contesto di dispositivo per una determinata pagina, oppure fare paginazione di tempo di stampa |
|
Per stampare una pagina specificata |
|
Per rilasciare le risorse GDI |
È possibile eseguire l'elaborazione questo componente in altre funzioni inoltre, ma queste funzioni sono quelle che possono stabilire il processo di stampa.
Nella figura che segue vengono illustrati i passaggi necessari nel processo di stampa e mostra dove ciascuna delle funzioni membro di stampa dei entity_CODECView è denominata.La parte restante di questo articolo viene illustrato più dettagliatamente la maggior parte di questi passaggi.Parti supplementari del processo di stampa sono descritte nell'articolo Allocare risorse GDI.
Ciclo di stampa
Paginazione
Il framework archivia la maggior parte delle informazioni su un processo di stampa in una struttura di CPrintInfo .Diversi valori in CPrintInfo riguardano paginazione, questi valori sono accessibili come illustrato nella tabella seguente.
Informazioni sul numero di pagina memorizzate in CPrintInfo
Variabile membro o nomi di funzione |
Numero di pagina fa riferimento |
---|---|
GetMinPage/SetMinPage |
Prima pagina del documento |
GetMaxPage/SetMaxPage |
Ultima pagina del documento |
GetFromPage |
Prima pagina da stampare |
GetToPage |
Ultima pagina da stampare |
m_nCurPage |
Pagina attualmente che viene stampata |
I numeri di pagina iniziano da 1, ovvero, la prima pagina è 1 numerato, non 0.Per ulteriori informazioni su questi e altri membri di CPrintInfo, vedere in riferimenti alla libreria MFC.
All'inizio del processo di stampa, il framework chiama la funzione membro di OnPreparePrinting di visualizzazione, passando un puntatore a una struttura di CPrintInfo .La procedura guidata fornisce un'implementazione di OnPreparePrinting che chiama DoPreparePrinting, un'altra funzione membro di CView.DoPreparePrinting è la funzione che consente di visualizzare la finestra di dialogo di stampa e crea un contesto di dispositivo della stampante.
A questo punto l'applicazione non conosce il numero di pagine sono presenti nel documento.Utilizza i valori predefiniti 1 e 0xFFFF per i numeri dei primi e l'ultima pagina del documento.Se si conosce il numero di pagine il documento dispone, eseguire l'override di OnPreparePrinting e la chiamata SetMaxPage per la struttura di CPrintInfo prima che la inviate a DoPreparePrinting.Questo consente di specificare la durata del documento.
DoPreparePrinting quindi viene visualizzata la finestra di dialogo di stampa.Quando restituisce, la struttura di CPrintInfo contiene i valori specificati dall'utente.Se i desideri dell'utente per stampare solo un intervallo selezionato le pagine, due campi possono specificare i numeri di pagina iniziale e finale nella finestra di dialogo di stampa.Il framework recupera tali valori utilizzando le funzioni di GetToPage e di GetFromPage di CPrintInfo.Se l'utente non specifica un intervallo di pagina, il framework chiama GetMinPage e GetMaxPage e utilizza i valori restituiti per stampare l'intero documento.
Per ogni pagina di un documento da stampare, il framework chiama due funzioni membro nella classe di visualizzazione, in OnPrepareDC e in OnPrinte passa a ogni funzione due parametri: un puntatore a un oggetto di CDC e un puntatore a una struttura di CPrintInfo .Quando il framework chiama OnPrepareDC e OnPrint, passa un valore diverso nel membro di m_nCurPage della struttura di CPrintInfo .In questo modo il framework indica alla visualizzazione quale la pagina deve essere stampati.
La funzione membro di OnPrepareDC viene inoltre utilizzata per la visualizzazione.Consente regolazioni in incrementi al contesto di dispositivo prima di creare sia successiva.OnPrepareDC offre un simile ruolo di stampa, ma esistono una coppia di differenze: innanzitutto, l'oggetto di CDC rappresenta un contesto di dispositivo della stampante anziché un contesto di dispositivo dello schermo e in secondo luogo, un oggetto di CPrintInfo viene passato come secondo parametro.(Questo parametro è NULL quando OnPrepareDC viene chiamato per la visualizzazione.) Eseguire l'override di OnPrepareDC per apportare modifiche al contesto di dispositivo basato su cui la pagina viene stampanda.Ad esempio, è possibile spostare l'origine del riquadro di visualizzazione e l'area di ridimensionamento per assicurarsi che la parte corretta del documento viene stampata.
La funzione membro di OnPrint esegue l'effettiva stampa della pagina.Nell'Come impostare come valore predefinito la stampa viene effettuata articolo nel framework chiama OnDraw con un contesto di dispositivo della stampante per eseguire la stampa.Più precisamente, le chiamate OnPrint del framework con una struttura di CPrintInfo e un contesto di dispositivo e sessioni di OnPrint il contesto di dispositivo a OnDraw.Eseguire l'override di OnPrint per eseguire il rendering che deve essere eseguita solo durante la stampa e non per la visualizzazione.Ad esempio, stampare le intestazioni o piè di pagina (vedere l'articolo intestazioni e piè di pagina per ulteriori informazioni.Successivamente chiamare OnDraw da un override di OnPrint per eseguire il comune di rendering sia la visualizzazione sia la stampa.
Il fatto che OnDraw esegue il rendering per la visualizzazione della stampa significa che l'applicazione viene WYSIWYG: “Quanto visibile si ottiene.„ Tuttavia, si supponga che non si scrive un'applicazione WYSIWYG.Ad esempio, si consideri un editor di testo che utilizza grassetto per i codici di controllo delle visualizzazioni ma di stampa di indicare il testo in grassetto sullo schermo.In una situazione, utilizzare la OnDraw per la visualizzazione.Quando si esegue l'override di OnPrint, sostituire la chiamata a OnDraw con una chiamata a una funzione distinta di disegno.La funzione consente di disegnare il documento alla modalità viene visualizzato su carte, mediante gli attributi non visualizzati sullo schermo.
Pagine della stampante suPagine di documento
Quando si fa riferimento ai numeri di pagina, è talvolta necessario distinguere tra il concetto delle stampanti in una pagina e il concetto di un documento di una pagina.Dal punto di vista della stampante, una pagina è un foglio di carta.Tuttavia, un foglio di carta necessariamente non è uguale a una pagina del documento.Ad esempio, se si stampa un informazioni, in cui i fogli devono essere piegati, un foglio di carta potrebbe contenere entrambe le prima e l'ultima pagine del documento, side-by-side.Analogamente, se si stampa di un foglio di calcolo, il documento non è costituito dalle pagine affatto.Al contrario, un foglio di carta potrebbe contenere le righe da 1 a 20, le colonne da 6 a 10.
Tutti i numeri di pagina nella struttura di CPrintInfo si riferiscono alle pagine della stampante.Il framework chiama una volta OnPrepareDC e OnPrint per ogni foglio di carta che verranno attraversati la stampante.Quando si esegue l'override della funzione di OnPreparePrinting per specificare la lunghezza del documento, è necessario utilizzare le pagine della stampante.Se c " è una corrispondenza esatta ovvero è uguale a una pagina della stampante una pagina di documento), questo è semplice.Se, invece, le pagine di documento e le pagine della stampante direttamente non corrispondono, è necessario convertire tra loro.Ad esempio, considerare la possibilità di stampare un foglio di calcolo.Quando si esegue l'override di OnPreparePrinting, è necessario calcolare il numero di fogli di carta saranno necessari per stampare l'intero foglio di calcolo e quindi utilizzare tale valore quando chiama la funzione membro di SetMaxPage di CPrintInfo.Analogamente quando si esegue l'override OnPrepareDC, è necessario convertire m_nCurPage in intervallo di righe e colonne che verranno visualizzati nel foglio specifico e quindi regolati l'origine del riquadro di visualizzazione di conseguenza.
Paginazione di tempo di stampa
In alcune situazioni, la classe di visualizzazione non può prevedere quanto tempo il documento è fino a applicare effettivamente.Ad esempio, si supponga che l'applicazione non sia WYSIWYG, pertanto una lunghezza del documento sullo schermo non corrisponde alla relativa lunghezza stampato.
Questo comporta un problema quando si esegue l'override di OnPreparePrinting per la classe di visualizzazione: non è possibile passare un valore alla funzione di SetMaxPage della struttura di CPrintInfo , poiché non si conosce la lunghezza di un documento.Se l'utente non specifica un numero di pagina per interrompere l'esecuzione nell'utilizzo della finestra di dialogo stampa, il framework non sa quando arrestare il ciclo di stampa.L'unico modo per determinare quando arrestare il ciclo di stampa è di stampare il documento e di visualizzare quando termina.La classe di visualizzazione necessario verificare la fine del documento mentre è stampanda quindi informare il framework durante la fine viene raggiunta.
Il framework utilizza la funzione di visualizzazione di OnPrepareDC della classe che richieda l'esecuzione quando arrestare.Dopo ogni chiamata a OnPrepareDC, il framework precedenti un membro della struttura di CPrintInfo chiamata m_bContinuePrinting.Il valore predefinito è TRUE. Se rimane pertanto, il framework continua il ciclo di stampa.Se sono impostate su FALSE, il framework interrotto.Per eseguire la paginazione di tempo di stampa, override OnPrepareDC per controllare se la fine del documento sia stata raggiunta e set m_bContinuePrinting a FALSE quando ha.
L'implementazione predefinita di OnPrepareDC imposta m_bContinuePrinting a FALSE se la pagina corrente è maggiore di 1.Ciò significa che se la lunghezza del documento non è stata specificata, il framework si presuppone il documento è una pagina tempo.Come conseguenza di questa è che è necessario prestare attenzione se si chiama la versione della classe base di OnPrepareDC.Non presupporre che m_bContinuePrinting verrà TRUE dopo la chiamata alla versione della classe base.