Nyomtatáshoz tegyünk fel tehát egy PrintDocument komponenst. Feladatként azt valósítjuk meg, hogy kinyomtatjuk az autoexec.bat állomány tartalmát. Ha esetleg az ön rendszerében ez nincs jelen, akkor írja át a forráskódban ezt a hivatkozást egy másik, létező szöveges állományra.
Ahhoz, hogy nyomtatni tudjunk egy szöveges állományt, ahhoz ismernünk kell annak tartalmát. Ehhez egy StreamReader osztályt hívunk segítségül, mellyel beolvashatjuk az állományunk tartalmát. A nyomtatási munka elindításához a PrintDocument komponens Print függvényét kell meghívnunk.
protected void button1_Click (object sender, System.EventArgs e)
{
try
{
st = new StreamReader("c:\\autoexec.bat");
try
{
font = new Font("Courier New", 10);
printDocument1.Print();
}
finally
{
st.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Amikor e Print meghívásra kerül, akkor jön létre a komponens PrintPage eseménye. Ez lesz az a pont a programunkban, ahol megmondhatjuk, hogy mit is küldünk a nyomtató felé.
Az esemény paramétereként kapunk egy PrintPageEventArgs típusú változót. Ebben sok olyan adat áll a rendelkezésünkre, melyet felhasználhatunk a nyomtatási munka elvégzéséhez. Így például a MarginBounds property-ben megkapjuk papírlaphoz tartozó margót. A Graphics property-n keresztül pedig tetszőleges grafikai funkciót elérhetünk a dokumentumunk kirajzolásához.
A szöveges állomány nyomtatását úgy végezzük el, hogy egy while ciklussal végigmegyünk az állomány egyes sorain. Ez a ciklus addig fut, amíg van elegendő hely az adott lapon a következő sor kinyomtatásához, vagy amíg van mit kinyomtatni. A ciklusmagban számláljuk az aktuális sor pozícióját, ahová írnunk kell. A szöveg kirajzolását a Graphics osztály DrawString függvényével végezzük.
A ciklus végeztével szintén a PrintPageEventArgs típusú változón keresztül jelezhetjük a PrintDocument komponens felé, hogy van-e még nyomtatandó munka vagy már végeztünk. Ezt a HasMorePages logikai property-nek történő értékadással tehetjük meg. Amennyiben ennek igaz értéket adunk, úgy a PrintDocument komponens új lapot nyit és újra aktivizálja a PrintPage eseményét.
protected void printDocument1_PrintPage (object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
...
float l = e.MarginBounds.Left;
float t = e.MarginBounds.Top;
float h = font.GetHeight(e.Graphics);
float max = e.MarginBounds.Height / h;
while (count < max && ((line = st.ReadLine()) != null))
{
y = count * h + t;
e.Graphics.DrawString(line, font, Brushes.Black, l, y, new StringFormat());
count++;
}
e.HasMorePages = line != null;
}