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.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
st = New StreamReader("c:\\autoexec.bat")
Try
f = New Font("Courier New", 10)
PrintDocument1.Print()
Finally
st.Close()
End Try
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
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.
Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
Dim y As Single = 0
Dim count As Integer = 0
Dim line As String = Nothing
Dim l As Single = e.MarginBounds.Left
Dim t As Single = e.MarginBounds.Top
Dim h As Single = f.GetHeight(e.Graphics)
Dim max As Single = e.MarginBounds.Height / h
line = st.ReadLine()
While count < max And line <> Nothing
y = count * h + t
e.Graphics.DrawString(line, f, Brushes.Black, l, y, New StringFormat())
count = count + 1
line = st.ReadLine()
End While
e.HasMorePages = line <> Nothing
End Sub