TN030: Personalizzazione stampa e anteprima di stampa

Questa nota viene descritto il processo di personalizzazione di stampa e anteprima di stampa e descrive gli scopi delle routine di richiamata utilizzati nel CView e le routine di richiamata e funzioni membro di CPreviewView.

Il problema

MFC fornisce una soluzione completa per la maggior parte della stampa e anteprima di stampa ha bisogno. In molti casi, poco codice aggiuntivo è richiesto di avere una visione in grado di stampare e visualizzare in anteprima. Tuttavia, ci sono modi per ottimizzare la stampa che richiedono notevole impegno da parte di sviluppatore, e alcune applicazioni è necessario aggiungere gli elementi dell'interfaccia utente specifica la modalità di anteprima di stampa.

Stampa efficiente

Quando un'applicazione MFC stampe utilizzando i metodi standard, Windows dirige tutte le chiamate di uscita grafica Device Interface (GDI) a un metafile in memoria. Quando viene chiamato EndPage , Windows Gioca metafile una volta per ciascuna banda fisico che richiede la stampante per stampare una pagina. Durante questa resa, GDI frequentemente una query la procedura Abort per determinare se esso dovrebbe continuare. In genere la procedura abort consente i messaggi da elaborare in modo che l'utente può interrompere il processo di stampa mediante una finestra di dialogo Stampa.

Purtroppo, questo può rallentare il processo di stampa. Se la stampa nell'applicazione deve essere più veloce di quanto può essere ottenuto utilizzando la tecnica standard, è necessario implementare manuale di banding.

Stampa di Banding

Al fine di banda manualmente, è necessario ri implementare il ciclo di stampa tale che OnPrint viene chiamato più volte per pagina (una volta ogni banda). Il ciclo di stampa viene implementato nella funzione OnFilePrint in viewprnt.cpp. Nel vostro CView-classe derivata si sovraccarico questa funzione in modo che la voce di mappa messaggi per gestire il comando di stampa chiama la funzione di stampa. Copiare la routine OnFilePrint e modificarne il ciclo di stampa per implementare la fascia. Vi sarà probabilmente anche voler passare il rettangolo bande a funzioni di stampa, in modo che è possibile ottimizzare il disegno basato sulla sezione della pagina in fase di stampa.

In secondo luogo, è necessario chiamare frequentemente QueryAbort mentre disegna la band. In caso contrario, la procedura di abortire non ottenere chiamata e l'utente sarà in grado di annullare il processo di stampa.

A&nteprima stampa: nbsp; Carta elettronica con interfaccia utente

Stampa anteprima, in sostanza, cerca di trasformare la visualizzazione in un'emulazione di una stampante. Per impostazione predefinita, l'area client della finestra principale viene utilizzata per visualizzare una o due pagine completamente all'interno della finestra. L'utente è in grado di ingrandire un'area della pagina per vedere in modo più dettagliato. Con il sostegno aggiuntivo, l'utente possa essere autorizzato anche per modificare il documento in modalità anteprima.

Personalizzazione di anteprima di stampa

La presente nota si occupa solo un aspetto della modifica l'anteprima di stampa: aggiunta dell'interfaccia utente per la modalità di anteprima. Altre modifiche sono possibili, ma tali cambiamenti sono fuori della portata di questa discussione.

In breve, è il processo di aggiunta dell'interfaccia utente per la modalità di anteprima:

  1. Derivare una classe vista da CPreviewView.

  2. Aggiungere gestori di comandi per gli aspetti di interfaccia utente che desideri.

  3. Se si aggiunge aspetti visivi al display, OnDraw eseguono l'override e disegno dopo la chiamata CPreviewView::OnDraw.

OnFilePrintPreview

Questo è il gestore di comandi per l'anteprima di stampa. L'implementazione predefinita è:

public static void CView::OnFilePrintPreview()
{
 nbsp;  / / &Nelle classi derivate, attuare finestra speciale gestione qui
    / / Assicurarsi di sganciare Frame Window vicino se collegato.

/ / non deve creare questo sul telaio. Deve sopravvivere a questa funzione
    CPrintPreviewState * pState = CPrintPreviewState nuovo;

if (!.DoPrintPreview (AFX_IDD_PREVIEW_TOOLBAR, questo,
                RUNTIME_CLASS(CPreviewView), pState))
    {
        / / Nelle classi derivate, reverse gestione finestra speciale
        / / qui per caso di fallimento di anteprima

TRACE0 ("errore: Impossibile DoPrintPreview");
        AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
        eliminare pState;      / / anteprima non è riuscito a inizializzare, / / delete stato ora
    }
}

DoPrintPreview nasconderà il riquadro principale dell'applicazione. Barre di controllo, come ad esempio la barra di stato, possono essere conservati specificandoli in pState-gt;membro di dwStates (questa è una maschera di bit e i bit per barre di controllo individuale sono definiti da AFX_CONTROLBAR_MASK(AFX_IDW_MYBAR)). La finestra pState - >nIDMainPane è la finestra che sarà automaticamente nascosta e reshown. DoPrintPreview creerà un bar di pulsante per l'interfaccia utente standard di anteprima. Se è necessaria la gestione finestra speciale, come ad esempio per nascondere o mostrare altre finestre, che dovrebbero essere fatto prima di DoPrintPreview viene chiamato.

Per impostazione predefinita, al termine dell'anteprima di stampa, esso restituisce le barre di controllo a loro stati originali e il riquadro principale al visibile. Se è necessaria una gestione speciale, dovrebbe essere fatto in un override del EndPrintPreview. Se DoPrintPreview non riesce, anche fornire una gestione speciale.

DoPrintPreview viene chiamato con:

EndPrintPreview

Questo è chiamato a terminare la modalità di anteprima di stampa. È spesso desiderabile per spostare la pa&gina nel documento che è stato ultima visualizzato in anteprima di stampa. EndPrintPreview è la possibilità dell'applicazione di farlo. PInfo-gt;membro m_nCurPage è l'ultima pagina visualizzata (a sinistra se due pagine sono state visualizzate) e il puntatore è un suggerimento da dove nella pagina dell'utente è stato interessato. Dal momento che la struttura della visualizzazione dell'applicazione è sconosciuta al quadro, i è necessario fornire il codice per spostare il punto prescelto.

È necessario eseguire la maggior parte delle azioni prima di chiamare CView::EndPrintPreview. Questa chiamata inverte gli effetti del DoPrintPreview ed elimina pView, pDC e pInfo.

/ / Le ulteriori operazioni di pulitura dovrebbe essere fatto qui.
CView::EndPrintPreview (pDC, pInfo, punto, pView)

CWinApp::OnFilePrintSetup

Questo deve essere mappato per la voce di menu impostazioni di stampa. Nella maggior parte dei casi, non è necessario eseguire l'override di attuazione.

Nomenclatura di pagina

Un altro problema è quello di numerazione di pagina e l'ordine. Per le applicazioni di tipo semplice elaboratore di testo, questa è una questione semplice. La maggior parte dei sistemi di anteprima di stampa si assumono che ogni pagina stampata corrisponde a una pagina nel documento.

Nel tentativo di fornire una soluzione generalizzata, ci sono parecchie cose da considerare. Immaginate un sistema CAD. L'utente ha un disegno che copre diversi fogli di formato E. Su un E-size (o in scala più piccola,) plotter, numerazione di pagina sarebbe come nel caso semplice. Ma su una stampante laser, stampa di 16 pagine formato per foglio, che cosa l'anteprima di stampa considerare una "pagina"?

Come afferma il paragrafo introduttivo, anteprima di stampa agisce come una stampante. Pertanto, l'utente vedrà che cosa sarebbe venuto fuori della particolare stampante selezionata. Spetta alla vista per determinare quale immagine viene stampato su ogni pagina.

La stringa di descrizione di pagina nella struttura CPrintInfo consente di visualizzare il numero di pagina per l'utente, se esso può essere rappresentato come un numero per ogni pagina (come in "Page 1" o "pagine 1-2"). Questa stringa viene utilizzata dall'implementazione predefinita di CPreviewView::OnDisplayPageNumber. Se è necessario un display differente, uno può eseguire l'override di questa funzione virtuale per fornire, ad esempio, "Foglio1, sezioni A, B".

&Note tecniche per numero |nbsp; Note tecniche per la categoria

Index