GDI+ je biblioteka klasa koja dozvoljava aplikacijama da komuniciraju sa uređajima za prikazivanje kao što su monitori, štampači, skeneri i sl. Na slikama je ilustrovana uloga GDI+ biblioteke u procesu crtanja figure na ekranu i u procesu štampe teksta.
Štampanje iz windows forme zahteva prvenstveno komponentu PrintDocument koja omogućava štampu. Komponente PrintDialog, PrintPriviewDialog i PageSetupDialog obezbeđuju opšte poznati grafički interfejs za štampu za korisnike Windows operativnog sistema.
Na formu se dodaje objekat PrintDocument. Zatim se kreira se PrintPage event handler za ovaj objekat. Zatim se koristi PrintPageEventArg objekat ovog event hendlera da se pristupi tzv. Graphics objektu štampača. Ovaj objekat možemo shvatiti kao površinu za crtanje. Pomoću graphics objekta moguće je crtati linije, krive, tekst itd. koristeći draw ili fill metod ovog objekta.
Na slici je ilustrovan dijagram toka procesa štampanja. Na već opisani način kreira se PrintDocument objekat i specificira se štampač. Zatim se setuju osobine štampača i osobine strane. Generiše se PrintPage event handler. Unutar ovog event handlera poziva se metoda Print PrintDocument objekta čime se vrši štampa.
Na ovoj slici je prikazan drugi deo dijagrama toka procesa štampanja koji je na prethodnoj slici označen sa A. Ovde je prikazana struktura event handlera za događaj PrintPage. Posle uzimanja Graphics objekta vrši se setovanje margina i ostala podešavanja strane. Koristi se neki od Draw ili Fill metoda ovog objekta za crtanje linija, oblika, pisanje teksta i sl.
Za slučaj štampanja tekstualnog fajla vrši se dodavanje PrintDocument komponente na windows formu a zatim se piše programska logika koja štampa fajl korišćenjem, PrintPage event handlera. PrintPage event handler generiše se dvostrukim klikom na PrintDocument komponentu. Event handler se izvršava nakon pozivanja Print metode objekta PrintDocument. Event hendleru se prosleđuje Graphics objekat koji se dobija pozivom svojstva Graphics PrintPageEventArgs klase.
Prikazaćemo važnije događaje, svojstva i metode PrintDocument objekta:
using System.Drawing.Printing;
private void Form2_Load(object sender, EventArgs e) |
PrintDocument pd = new PrintDocument (); pd.PrinterSettings.PrinterName = printersList.SelectedItem.ToString(); pd.Print(); |
Najpre je potrebno uključiti prostor imena System.Drawing.Printing. Korišćenjem svojstva InstalledPrinters klase PrinterSettings najpre se proverava da li na sistemu ima instaliranih štampača. Zatim se imena štampača dodaju u ComboBox kontrolu. Da bi se inicirao proces štampe potrebno je najpre instancirati PrintDocument objekat, iz koda ili prevlčenjem sa Toolboxa. Zatim se preko svojstva PrinterSetting pristupa odgovarajućoj PrinterSettings klasi i korišćenjem svojstva PrinterName se vrši odabir željenog štampača. Proces štampe kreće pozivom Print metode PrintDocument objekta.
public StreamReader sr; public Font mojFont; |
private void printDocument1_BeginPrint(object sender, PrintEventArgs e) { sr = new StreamReader(@"C:Temp aspored.txt"); mojFont = new Font("Calibri", 11); printDocument1.PrinterSettings.PrinterName = printersList.SelectedItem.ToString(); } |
U BeginPrint događaju PrintDocument objekta kreira se objekat klase StreamReader koji će čitati fajl koga treba odštampati. Takođe se korišćenjem klase Font definiše font kojim će biti odštampan tekst koji se nalazi u fajlu na koga pokazuje StreamReader.
private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) { Graphics g = e.Graphics; float linijaPoStrani = 0; float yPoz = 0; int broj = 0; float levaMargina = e.MarginBounds.Left; float gornjaMargina = e.MarginBounds.Top; string linija = null; linijaPoStrani = e.MarginBounds.Height / mojFont.GetHeight(g); while (broj < linijaPoStrani && ((linija = sr.ReadLine()) != null)) { yPoz = gornjaMargina + (broj * mojFont.GetHeight(g)); g.DrawString(linija, mojFont, Brushes.Black, levaMargina, yPoz); broj++; } if (linija != null) e.HasMorePages = true; else e.HasMorePages = false; } |
Unutar PrintPage event handlera se najpre kreira Graphics objekat. Uzimanjem leve i gornje margine definiše se gornji levi ugao odakle počinje štampanje teksta. Broj linija teksta po strani zavisi od visine strane i veličine fonta koji se koristi. Treba uzeti u obzir da se koordinatni početak nalazi u gornjem levom uglu ekrana i da se x osa proteže po horizontali na desno, a y osa po vertikali na dole. Čita se linija po linija teksta iz fajla i štampa počev od kraja leve margine. Koordinata y se za svaku sledeću liniju teksta povećava za visinu fonta. Kada se ispiše jedna strana teksta proverava se da li ima još linija za štampu. Ukoliko ima postavlja se svojstvo HasMorePages objekta PrintPageEventArgs na vrednost true i funkcija se izvršava ponovo.
Svojstvo Graphics ovog objekta vraća Graphics objekat. Svojstvo HasMorePages treba setovati na true ako još strana treba štampati, podrazumevana vrednost je false. Svojstvo MarginBounds vraća pravougaonik koji predstavlja stranu unutar margina. Svojstvo PageSettings predstavlja skup setovanja za tekuću stranu.
private void buttonStampaj_Click(object sender, EventArgs e) { printDocument1.Print(); } |
Štampanje dokumenta se vrši pozivom Print metode odgovarajućeg PrintDocument objekta.
Kontrola PrintPriviewDialog se koristi za prikaz dokumenta pre nego što će se pristupiti njegovom štampanju. Kreira se instanca klase PrintPreview ili se prevuče odgovarajuća kontrola na formu. Setuje se property Document ovog objekta na odgovarajući PrintDocument objekat. Dijalog se prikazuje korišćenjem ShowDialog metode.
private void button1_Click(object sender, EventArgs e) { printPreviewDialog1.PrintPreviewControl.Zoom = 1; printPreviewDialog1.ShowDialog(); } |
Na primeru je ilustravano povezivanje PrintPriview dijaloga sa odgovarajućim dokument objektom. Pozivom metode ShowDialog se unutar event handlera za klik na dugme prikazuje PrintPreview dijalog.
Podešavanje strane pre štampe
Korišćenjem PageSetupDialog komponente može se omogućiti korisniku da podesi osobine strane. Korisnik može podesiti granice i margine, da definiše hedere i futere i specificira orjentaciju strane. Potrebno je kontrolu PageSetupDialog povezati sa odgovarajućim PrintDocument objektom, tj. dokumentom koga treba odštampati.
Koristi se ShowDialog() metoda za prikaz dialoga za podešavanje strane. Specificira se podrazumevano setovanje za sve strane koristeći DefaultPageSettings svojsto objekta PrintDocument.
private void button2_Click(object sender, EventArgs e) { pageSetupDialog1.Document.DefaultPageSettings.Color = false; pageSetupDialog1.ShowDialog(); } |
Na primeru je prikazano povezivanje PageSetup dijaloga sa odgovarajućim dokument objektom. Pomoću DefaultPageSettings svojstva dokument objekta podešava se da štampa bude u crno beloj tehnici, tj. svojstvo Color se postavlja na vrednost false.
private void buttonStampaj_Click(object sender, EventArgs e) { if (printDialog1.ShowDialog() == DialogResult.OK) { printDocument1.Print(); } } |
Koristi se za specifikaciju setovanja vezanih za štampač. Kreira se instanca klase PrintDialog ili se prevuče odgovarajuća kontrola na formu. Postavi se njeno svojstvo Document na odgovarajući objekat klase PrintDocument. Zatim se prikazuje PrintDialog na kome korisnik odabira štampač. Kada korisnik odabere štampač i klikne na OK dugme dijaloga započinje proces štampe dokumenta.
// Load procedura forme nije više potrebna private void printDocument1_BeginPrint(object sender, PrintEventArgs e) { sr = new StreamReader(@"C:Temp aspored.txt"); mojFont = new Font("Calibri", 11);// //printDocument1.PrinterSettings.PrinterName = //printersList.SelectedItem.ToString(); } |
Sada Load procedura koja je definisana pre, nije potrebna jer se izbor štampača vrši korišćenjem PrintDialog kontrole. Takođe u BeginPrint proceduri treba izbaciti odgovarajuće linije koda koje se odnose na izbor štampača. Na slici je prikazan izgled PrintDialog prozora za izbor štampača.