Condividi tramite


Architettura dell'anteprima di stampa

Questo articolo illustra come il framework MFC implementa la funzionalità di anteprima di stampa. Gli argomenti trattati includono:

L'anteprima di stampa è leggermente diversa dalla visualizzazione dello schermo e dalla stampa perché, invece di disegnare direttamente un'immagine in un dispositivo, l'applicazione deve simulare la stampante usando lo schermo. A tale scopo, microsoft Foundation Class Library definisce una classe speciale (non documentata) derivata dalla classe CDC, denominata CPreviewDC. Tutti gli CDC oggetti contengono due contesti di dispositivo, ma in genere sono identici. In un CPreviewDC oggetto sono diversi: il primo rappresenta la stampante simulata e il secondo rappresenta lo schermo in cui viene effettivamente visualizzato l'output.

Processo di anteprima di stampa

Quando l'utente seleziona il comando Anteprima di stampa dal menu File , il framework crea un CPreviewDC oggetto. Ogni volta che l'applicazione esegue un'operazione che imposta una caratteristica del contesto del dispositivo della stampante, il framework esegue anche un'operazione simile nel contesto del dispositivo dello schermo. Ad esempio, se l'applicazione seleziona un tipo di carattere per la stampa, il framework seleziona un tipo di carattere per la visualizzazione dello schermo che simula il tipo di carattere della stampante. Ogni volta che l'applicazione invia l'output alla stampante, il framework invia invece l'output allo schermo.

L'anteprima di stampa differisce anche dalla stampa nell'ordine in cui vengono disegnate le pagine di un documento. Durante la stampa, il framework continua un ciclo di stampa fino a quando non viene eseguito il rendering di un determinato intervallo di pagine. Durante l'anteprima di stampa, una o due pagine vengono visualizzate in qualsiasi momento e quindi l'applicazione attende; non vengono visualizzate altre pagine finché l'utente non risponde. Durante l'anteprima di stampa, l'applicazione deve anche rispondere a WM_PAINT messaggi, proprio come durante la visualizzazione normale dello schermo.

La funzione CView::OnPreparePrinting viene chiamata quando viene richiamata la modalità di anteprima, proprio come all'inizio di un processo di stampa. La struttura CPrintInfo passata alla funzione contiene diversi membri i cui valori è possibile impostare per regolare determinate caratteristiche dell'operazione di anteprima di stampa. Ad esempio, è possibile impostare il membro m_nNumPreviewPages per specificare se si desidera visualizzare in anteprima il documento in modalità una pagina o due pagine.

Modifica dell'anteprima di stampa

È possibile modificare il comportamento e l'aspetto dell'anteprima di stampa in diversi modi piuttosto facilmente. Ad esempio, è possibile, tra le altre cose:

  • Consente alla finestra di anteprima di stampa di visualizzare una barra di scorrimento per accedere facilmente a qualsiasi pagina del documento.

  • Fare in modo che l'anteprima di stampa mantenga la posizione dell'utente nel documento iniziando la visualizzazione nella pagina corrente.

  • Causa l'esecuzione di inizializzazione diversa per l'anteprima di stampa e la stampa.

  • Fare in modo che l'anteprima di stampa visualizzi i numeri di pagina nei formati personalizzati.

Se si conosce la lunghezza del documento e si invoca SetMaxPage con il valore appropriato, il framework può usare queste informazioni sia in modalità anteprima che durante la stampa. Una volta che il framework conosce la lunghezza del documento, può fornire alla finestra di anteprima una barra di scorrimento, consentendo all'utente di scorrere il documento in modalità di anteprima. Se non è stata impostata la lunghezza del documento, il framework non può posizionare la casella di scorrimento per indicare la posizione corrente, quindi il framework non aggiunge una barra di scorrimento. In questo caso, l'utente deve usare i pulsanti Pagina successiva e Pagina precedente sulla barra di controllo della finestra di anteprima per scorrere il documento.

Per l'anteprima di stampa, può risultare utile assegnare un valore al membro m_nCurPage di CPrintInfo, anche se non lo si farebbe mai per la stampa normale. Durante la stampa normale, questo membro trasferisce informazioni dal framework alla classe di visualizzazione. Questo è il modo in cui il framework indica alla visualizzazione quale pagina deve essere stampata.

Al contrario, all'avvio della modalità di anteprima di stampa, il membro m_nCurPage contiene informazioni nella direzione opposta: dalla visualizzazione al framework. Il framework usa il valore di questo membro per determinare quale pagina deve essere visualizzata in anteprima per prima. Il valore predefinito di questo membro è 1, quindi inizialmente viene visualizzata la prima pagina del documento. È possibile eseguire l'override OnPreparePrinting per impostare questo membro sul numero della pagina visualizzata al momento in cui è stato richiamato il comando Anteprima di stampa. In questo modo, l'applicazione mantiene la posizione corrente dell'utente quando si passa dalla modalità di visualizzazione normale alla modalità di anteprima di stampa.

A volte potrebbe essere necessario eseguire un'inizializzazione differente a seconda che venga chiamato per un lavoro di stampa o per l'anteprima di stampa. È possibile determinare questo problema esaminando la variabile membro m_bPreview nella CPrintInfo struttura. Questo membro è impostato su TRUE quando viene richiamata l'anteprima di stampa.

La CPrintInfo struttura contiene anche un membro denominato m_strPageDesc, che viene usato per formattare le stringhe visualizzate nella parte inferiore della schermata in modalità a pagina singola e a più pagine. Per impostazione predefinita, queste stringhe sono nel formato "Page n" e "Pages n - m", ma è possibile modificare m_strPageDesc dall'interno OnPreparePrinting e impostare le stringhe su un valore più elaborato. Per altre informazioni, vedere CPrintInfo Structure (Struttura CPrintInfo ) in MFC Reference (Informazioni di riferimento su MFC ).

Vedere anche

Stampa e anteprima di stampa
Stampa
Classe CView
Classe CDC