Technology Experience

Contenuti gestiti da Igor Damiani
posts - 949, comments - 2741, trackbacks - 15120

My Links

News

  • Questo blog si propone di raccogliere riflessioni, teoriche e pratiche, su tutto quello che riguarda il world-computing che mi sta attorno: programmazione in .NET, software attuale e futuro, notizie provenienti dal web, tecnologia in generale, open-source.

    L'idea è quella di lasciare una sorta di patrimonio personale, una raccolta di idee che un giorno potrebbe farmi sorridere, al pensiero di dov'ero e cosa stavo facendo.

    10/05/2005,
    Milano

Archives

Post Categories

Generale

[70-526, #7] Stampare con il Framework 2.0

E' talmente tanto che uso Reporting Services di SQL Server 2005 che ho spazzato dalla mia mente tutto quello che ho studiato per il 70-316. Ma è bastato un esercizio di auto-ipnosi regressiva per ricordare tutto quello che c'è da sapere - ovviamente, sto scherzando.

Le classi
Quando si tratta di stampare con il FX2.0, dobbiamo focalizzare la nostra attenzione su una manciata di classi:

PrintDocument, che rappresenta un documento da stampare
PrintDialog, che rappresenta la dialog standard per scegliere la stampante su cui inviare l'output
PrintPreviewDialog, che permette di mostrare all'utente una finestra per l'anteprima di stampa
PageSetupDialog, che permette all'utente di impostare margini, orientamento e stampante

Il più importante di tutti è il PrintDocument, che è il documento vero e proprio e spesso è un input per le altre dialog elencate sopra. Prima di poter utilizzare i dialog standard di Windows, dobbiamo quindi generare un documento e capire come impaginare il contenuto, come generare più pagine e così via. Creare un oggetto PrintDocument implica la buona conoscenza di GDI+, perchè ogni cosa renderizzata su un PrintDocument viene disegnata attraverso la classe Graphics e tutti i suoi metodi.

La cosa più semplice che possiamo fare per cominciare a lavorare con un PrintDocument è quello di trascinarlo dalla Toolbox su una Windows Form. Il PrintDocument comparirà nella tray-area della WF stessa. Siccome però siamo sviluppatori, vediamo come fare tutto via codice, giusto per continuare a battere sulla tastiera e a dimenticare un po' il mouse. :-)

PrintDocument doc = new PrintDocument(); doc.BeginPrint += new PrintEventHandler(doc_BeginPrint); doc.EndPrint += new PrintEventHandler(doc_EndPrint); doc.PrintPage += new PrintPageEventHandler(doc_PrintPage); doc.QueryPageSettings += new QueryPageSettingsEventHandler(doc_QueryPageSettings);

Per cominciare la stampa diretta sulla stampante di default di Windows, è sufficiente chiamare il metodo Print della classe PrintDocument. La chiamata a questo metodo non visualizza nulla, non c'è interazione con l'utente. Il FX usa il PrintDocument, genera il contenuto per ciascuna pagina e stampa.

La classe PrintDocument espone 4 importanti eventi. BeginPrint viene sollevato all'inizio della stampa, prima che la prima pagina venga stampata. EndPrint viene sollevato al termine della stampa. PrintPage e QueryPageSettings vengono sollevati ad ogni pagina: il primo viene sollevato quando occorre generare il contenuto della pagina per l'invio alla stampante. QueryPageSettings viene sollevato prima ancora di PrintPage, e permette di impostare un particolare formato per ciascuna pagina (orientamento, margini e così via).

Il più importante fra questi è indubbiamente PrintPage. Il parametro PrintPageEventArgs permette di ottenere un riferimento a Graphics, attraverso il quale possiamo disegnare testo, grafica e così via. Questa classe espone alcune proprietà essenziali per la gestione della stampa: possiamo impostare la proprietà Cancel a false per annullare il processo di stampa, possiamo impostare HasMorePages a true per indicare che ci sono ancora pagine da stampare. Difatti, l'evento PrintPage viene continuamente chiamato fintantochè HasMorePages continua a valere true. La proprietà PageBounds rappresenta la dimensione totale della pagina su cui si sta stampando, mentre MarginBounds considera anche eventuali margini della pagina stessa. La proprietà PageSettings consente l'accesso a tutta una serie di informazioni sulla pagina corrente (Bounds, Margins, PaperSize, PrintableArea, PrinterResolution).

Per un esempio più pratico e per maggiori informazioni, rimando al mio vecchio post sull'esame 70-316.

In breve, la classe PrintPreviewDialog
Se volessimo mostrare un'anteprima di stampa, possiamo utilizzare il componente PrintPreviewDialog. Per utilizzare, non dobbiamo fare altro che impostare la proprietà Document su un oggetto PrintDocument valido. La chiamata al metodo ShowDialog mostra l'anteprima, scatenando prima gli eventi relativi al PrintDocument di cui abbiamo discusso prima.

Print | posted on Monday, January 29, 2007 12:16 PM | Filed Under [ Esame 70-526 ]

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET