Già ai tempi dell'esame 70-316, avevamo visto gli strumenti che il FW2.0 ci mette a disposizione per produrre anteprime di stampa dei nostri documenti PrintDocument. Attraverso la classe PrintPreviewDialog, abbiamo a disposizione una Windows Form che mostra l'anteprima di stampa del nostro documento. Questa Windows Form non è modificabile: così è, e così ce la teniamo. Come tutte le WF, per visualizzarle non dobbiamo fare altro che chiamare il metodo ShowDialog, solo dopo aver impostato la proprietà Document sull'istanza di PrintDocument di cui vogliamo generare l'anteprima. La chiamata a ShowDialog scatena la stampa del documento, che però non viene indirizzata sulla stampante di default, bensì sulla finestra di dialogo, scatenando l'esecuzione dell'evento PrintPage per ogni pagina come abbiamo già visto precedentemente.
La WF visualizzata dal PrintPreviewDialog possiede alcune caratteristiche particolari. Vediamole perchè ci torneranno utili più avanti:
- La superficie della form è occupata per la maggior parte da un rettangolo bianco che mostra l'anteprima
- In alto a sinistra c'è una piccola toolbar, che ci consente di stampare il documento, di impostare lo zoom, di decidere quante pagine vogliamo vedere alla volta (1, 2, 3, 4 e 6) e di chiudere la finestra
- In alto a destra c'è un controllo NumericUpDown che ci permette di scorrere le pagine che compongono il documento
Il controllo PrintPreviewControl
Con il FW2.0 c'è una possibilità in più. Grazie all'implementazione della classe PrintPreviewControl, infatti, possiamo creare una finestra di anteprima custom, personalizzandola e aggiungendo features come desideriamo noi. Il "rettangolo bianco" di cui ho parlato al punto (1) non è nient'altro che un controllo PrintPreviewControl, che renderizza un PrintDocument. Come tutti i controlli, anche questo deve essere posizionato su una Windows Form normalissima, che quindi possiamo disegnare come vogliamo noi.
PrintPreviewControl espone alcune proprietà che ci permettono di emulare il comportamento della WF standard mostrata da PrintPreviewDialog. Le proprietà sono:
- la proprietà Document è la più importante: stabilisce quale PrintDocument mostrare nell'anteprima
- Columns e Rows permettono di stabilire quante pagine vedere nell'anteprima (rispettivamente in senso orizzontale e verticale)
- Zoom permette di stabilire lo zoom iniziale dell'anteprima
- StartPage permette di stabilire la pagina del PrintDocument da visualizzare
- la proprietà UseAntiAlias, come dice il nome stesso, renderizza i font con un effetto di anti-aliasing per migliorarne la leggibilità
Agendo su queste proprietà, quindi, possiamo riprodurre tutte le funzionalità della dialog esposta da PrintPreviewDialog. Ma possiamo andare un po' più in là, aggiungendo features (controlli, per esempio) alla WF capaci di agire sul PrintDocument e di modificarne la stampa.
La sicurezza - PrintingPermission
Il FW2.0 ci permette di regolare l'accesso alle stampanti da parte del nostro managed code, coinvolgendo la classe PrintingPermission, che eredita direttamente da CodeAccessPermission. Tale classe espone la proprietà Level, che assume i valori determinati dall'enum PrintingPermissionLevel (AllPrinting, DefaultPrinting, NoPrinting e SafePrinting). La classe PrintingPermission dispone oltre agli altri dei metodi Assert e Demand. Vi consiglio una lettura agli articoli su MSDN intitolati Security Permissions e Requesting Permissions.