Share via


TN030: personalizzare stampa e anteprima di stampa

[!NOTA]

La seguente nota tecnica non è stata aggiornata dalla prima volta che viene inclusa nella documentazione online.Di conseguenza, alcune procedure e argomenti potrebbero non essere aggiornati o errati.Per le informazioni più recenti, è consigliabile cercare l'argomento di interesseindice della documentazione online.

Questa nota viene descritto il processo di personalizzazione della stampa e anteprima di stampa e descritti gli scopi delle routine di callback utilizzate in CView e le routine e le funzioni membro di callback di CPreviewView.

Il problema

MFC fornisce una soluzione completa per la maggior parte delle necessità di anteprima di stampa e di stampa.Nella maggior parte dei casi, una quantità minima di codice aggiuntivo è necessario disporre di una visualizzazione in grado di visualizzare e visualizzare l'anteprima.Tuttavia, esistono diversi modi per ottimizzare la stampa che richiedono lo sforzo significativo da parte dello sviluppatore e alcune applicazioni devono aggiungere gli elementi dell'interfaccia utente specifici della modalità anteprima di stampa.

Premere efficiente

Quando un'applicazione MFC stampa utilizzando i metodi standard, le finestre indirizza tutte le chiamate grafiche dell'output (GDI) dell'interfaccia di dispositivo per i metafile in memoria.Quando EndPage viene chiamato, le finestre riprodotta una volta metafile per ogni banda fisica che la stampante richieste per stampare una pagina.Durante il rendering, GDI eseguire una query frequentemente la routine di interruzione per determinare se continua.In genere la routine di interruzione consente i messaggi da elaborare in modo da consentire l'interruzione del processo di stampa utilizzando una finestra di dialogo di stampa.

Sfortunatamente, questo può influire negativamente il processo di stampa.Se la stampa nell'applicazione deve essere più veloce di può essere raggiunto utilizzando la tecnica standard, è necessario implementare la fascia manuale.

Fascia di stampa

Per manualmente senza, è necessario con riferimento per implementare il ciclo di stampa in modo che OnPrint viene chiamato più volte per pagina (una volta per banda).Il ciclo di stampa viene implementato nella funzione di OnFilePrint in viewprnt.cpp.Nel CViewclasse derivata da, si esegue l'overload della funzione in modo che la voce della mappa messaggi per gestione il comando di stampa chiamare la funzione di stampa.Copiare la routine di OnFilePrint e modificare il ciclo di stampa per l'implementazione di fascia.Probabilmente preferibile passare il rettangolo di fascia alle funzioni di stampa in modo da ottimizzare il disegno in base alla sezione della pagina che viene stampata.

In secondo luogo, è necessario chiamare spesso QueryAbort mentre disegni la banda.In caso contrario, la routine di interruzione non verrà chiamata e l'utente non sarà in grado di annullare il processo di stampa.

Anteprima di stampa: Carta elettronica con interfaccia utente

Anteprima di stampa, in pratica, tenta di convertire la visualizzazione in un'emulazione di una stampante.Per impostazione predefinita, all'area client della finestra principale viene utilizzata per visualizzare una o due pagine completamente all'interno della finestra.L'utente può ingrandire un'area della pagina per visualizzarla in modo più dettagliato.Con supporto aggiuntivo, l'utente può anche essere consentito per modificare il documento in modalità di anteprima.

Personalizzare anteprima di stampa

Questa nota consente solo di un aspetto di modificare l'anteprima di stampa: Interfaccia utente di aggiunta alla modalità di anteprima.Altre modifiche possibili, ma tali modifiche sono completamente fuori dall'ambito di questa discussione.

Per aggiungere interfaccia utente alla modalità di anteprima

  1. Derivare una classe di visualizzazione da CPreviewView.

  2. Aggiungere gestori comandi per gli aspetti dell'interfaccia utente desiderato.

  3. Se si aggiungono gli aspetti visivi alla visualizzazione, eseguire l'override di OnDraw ed eseguire il disegno dopo aver chiamato CPreviewView::OnDraw.

OnFilePrintPreview

Si tratta del gestore comando per l'anteprima di stampa.L'implementazione predefinita è:

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

DoPrintPreview nascondere il riquadro principale dell'applicazione.Le barre di controllo, come la barra di stato, possono essere mantenute specificandoli nel membro didwStates dello pState-> (questa è una maschera di bit e i bit per le singole barre di controllo sono definiti da AFX_CONTROLBAR_MASK(AFX_IDW_MYBAR).Lo pState->nIDMainPane della finestra è quella che verrà automaticamente nascosta e reshown.DoPrintPreview quindi creata una barra del pulsante per l'interfaccia utente di anteprima standard.Se speciale la gestione della finestra è necessaria, come nascondere o mostrare le altre finestre, che deve essere eseguito prima che DoPrintPreview venga chiamato.

Per impostazione predefinita, quando l'anteprima di stampa completo, restituisce le barre di controllo agli stati originali e al riquadro principale su visibile.Se una gestione speciale è necessaria, deve essere eseguita nell'override di EndPrintPreview. Se DoPrintPreview ha esito negativo, anche garantire una gestione speciale.

DoPrintPreview viene chiamato con:

  • ID di risorsa modello di finestra di dialogo per la barra degli strumenti di anteprima.

  • Un puntatore alla visualizzazione per eseguire la stampa per l'anteprima di stampa.

  • La classe di runtime della classe di visualizzazione anteprima.Verrà creata dinamicamente in DoPrintPreview.

  • Il puntatore di CPrintPreviewState.Si noti che la struttura di CPrintPreviewState (o la struttura derivata se l'applicazione richiede più stata mantenuta) non deve essere creata sul frame.DoPrintPreview non è modale e questa struttura deve gestite a finché non viene chiamato EndPrintPreview.

    [!NOTA]

    Se una visualizzazione o una classe separata di visualizzazione è necessaria per la stampa di supporto, un puntatore a tale oggetto deve essere passato come secondo parametro.

EndPrintPreview

Questa operazione è detta per terminare la modalità anteprima di stampa.È spesso opportuno per passare alla pagina nel documento che è stato visitato per ultimo in anteprima di stampa.EndPrintPreview è la possibilità di eseguire questa operazione.Il membro dim_nCurPage di pInfo-> è quella che visualizzare l'ultimo aggiornamento (più a sinistra se due pagine vengono visualizzate) e il puntatore indica quanto in cui la pagina l'utente è interessati.Poiché la struttura della visualizzazione dell'applicazione è sconosciuta al framework, è necessario fornire codice per passare al punto scelto.

È necessario eseguire la maggior parte delle operazioni prima di chiamare CView::EndPrintPreview.Questa chiamata viene invertito gli effetti di DoPrintPreview ed elimina il, ossia il pDC e il pInfo.

// Any further cleanup should be done here.
CView::EndPrintPreview(pDC, pInfo, point, pView);

CWinApp::OnFilePrintSetup

Ciò è necessario eseguire il mapping per la voce di menu di installazione di stampa.Nella maggior parte dei casi, non è necessario eseguire l'override dell'implementazione.

Nomenclatura della pagina

Un l'altra questione è quello del numero di pagina e ordine.Per le applicazioni semplici del tipo dell'elaboratore di testo, questa è una chiara problema.La maggior parte dei sistemi di anteprima di stampa si presuppone che in ogni pagina stampata corrisponda a una pagina nel documento.

Si tenta di fornire una soluzione generalizzata, sono disponibili le informazioni riportate di seguito.Si consideri un sistema di cad.L'utente ha un disegno che analizza diversi fogli di E-dimensione.In un tracciatore un più piccolo (o di E-dimensione, ridimensionato), il numero di pagina verrebbe come nel caso più semplice.Ma una stampante a laser, stampante 16 pagine di unidimensionale per foglio, quali l'anteprima di stampa considera “una pagina„?

Durante introduttivi di paragrafo, anteprima di stampa viene utilizzato come una stampante.Di conseguenza, l'utente vedrà che il uscirebbe dalla stampante particolare selezionata.Il metodo è attivo fino alla visualizzazione per determinare quale immagine viene stampata in ogni pagina.

La stringa descrittiva della pagina nella struttura di CPrintInfo consente di visualizzare il numero di pagina all'utente se può essere rappresentata come un numero di pagina (come in “pagina 1 " o “pagine 1-2„).Questa stringa viene utilizzata dall'implementazione predefinita di CPreviewView::OnDisplayPageNumber.Se una visualizzazione diversa è necessaria, è possibile eseguire l'override della funzione virtuale per fornire, ad esempio, “Sheet1, sezioni A, B„.

Vedere anche

Altre risorse

Note tecniche del numero

Note tecniche per categoria