我应该在代码中进行哪些更改,以便在“打印预览”中看到多个页面,并且还要打印多个页面?
Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDoc.PrintPage
Static intStart As Integer
Dim font0 As New Font("arial", 24, FontStyle.Underline)
Dim fntText As Font = font0
Dim txtHeight As Integer
Dim LeftMargin As Integer = PrintDoc.DefaultPageSettings.Margins.Left
Dim TopMargin As Integer = PrintDoc.DefaultPageSettings.Margins.Top
txtHeight = PrintDoc.DefaultPageSettings.PaperSize.Height - PrintDoc.DefaultPageSettings.Margins.Top - PrintDoc.DefaultPageSettings.Margins.Bottom
Dim LinesPerPage As Integer = CInt(Math.Round(txtHeight / (fntText.Height + 0.025)))
e.Graphics.DrawRectangle(Pens.White, e.MarginBounds)
Dim intLineNumber As Integer
e.Graphics.DrawString("Support", font0, Brushes.Black, 75, 50)
For intCounter = intStart To lstLinesToPrint.Count - 1
e.Graphics.DrawString(lstLinesToPrint(intCounter), fntText, Brushes.Black, LeftMargin, fntText.Height * intLineNumber + TopMargin)
intLineNumber += 1
If intLineNumber > LinesPerPage - 1 Then
intStart = intCounter
e.HasMorePages = True
Exit For
End If
Next
End Sub
答案 0 :(得分:0)
照原样,您的代码可以打印多页...只要提供其他代码即可。
我在窗体上放置了两个按钮bnPrint和bnPreview,并创建了一些数据进行测试:
Option Strict On
Imports System.Drawing.Printing
Public Class Form1
Enum PrintOperation
Print
Preview
End Enum
Dim pageSetupDialog1 As PageSetupDialog
Dim pd As PrintDocument
Dim selectedPrinter As String
Dim lstLinesToPrint As New List(Of String)
Sub PrintDoc(operation As PrintOperation)
Try
pd = New PrintDocument()
pageSetupDialog1 = New PageSetupDialog
pageSetupDialog1.PageSettings = New PageSettings
' initialize dialog's PrinterSettings property to hold user-set printer settings.
pageSetupDialog1.PrinterSettings = New PrinterSettings
pageSetupDialog1.AllowMargins = True
pageSetupDialog1.ShowNetwork = True
If selectedPrinter <> "" Then
pageSetupDialog1.PrinterSettings.PrinterName = selectedPrinter
End If
Dim result As DialogResult = pageSetupDialog1.ShowDialog()
If result = DialogResult.OK Then
selectedPrinter = pageSetupDialog1.PrinterSettings.PrinterName
AddHandler pd.BeginPrint, AddressOf pd_BeginPrint
AddHandler pd.QueryPageSettings, AddressOf pd_QueryPageSettings
AddHandler pd.PrintPage, AddressOf pd_PrintPage
Try
If operation = PrintOperation.Print Then
pd.Print()
Else
Using ppd As New PrintPreviewDialog
ppd.Document = pd
ppd.ShowDialog()
End Using
End If
Catch ex As Exception
MsgBox("Oops: " & ex.Message)
Finally
RemoveHandler pd.BeginPrint, AddressOf pd_BeginPrint
RemoveHandler pd.QueryPageSettings, AddressOf pd_QueryPageSettings
RemoveHandler pd.PrintPage, AddressOf pd_PrintPage
End Try
End If
Finally
pageSetupDialog1.Dispose()
pd.Dispose()
End Try
End Sub
Sub pd_BeginPrint(ByVal sender As Object, ByVal ev As PrintEventArgs)
pd.PrinterSettings.PrinterName = selectedPrinter
pd.DocumentName = "Test document"
End Sub
Sub pd_QueryPageSettings(ByVal sender As Object, ByVal e As System.Drawing.Printing.QueryPageSettingsEventArgs)
' make sure the orientation is set /before/ it gets to pd_PrintPage
e.PageSettings.Landscape = pageSetupDialog1.PageSettings.Landscape
End Sub
Private Sub pd_PrintPage(sender As Object, e As Printing.PrintPageEventArgs)
Static intStart As Integer
Using font0 As New Font("Arial", 24, FontStyle.Underline), fntText As Font = font0
Dim LeftMargin As Integer = pd.DefaultPageSettings.Margins.Left
Dim TopMargin As Integer = pd.DefaultPageSettings.Margins.Top
Dim txtHeight = pd.DefaultPageSettings.PaperSize.Height - pd.DefaultPageSettings.Margins.Top - pd.DefaultPageSettings.Margins.Bottom
Dim LinesPerPage As Integer = CInt(Math.Round(txtHeight / (fntText.Height + 0.025)))
e.Graphics.DrawRectangle(Pens.White, e.MarginBounds)
Dim intLineNumber As Integer
e.Graphics.DrawString("Support", font0, Brushes.Black, 75, 50)
For intCounter = intStart To lstLinesToPrint.Count - 1
e.Graphics.DrawString(lstLinesToPrint(intCounter), fntText, Brushes.Black, LeftMargin, fntText.Height * intLineNumber + TopMargin)
intLineNumber += 1
If intLineNumber > LinesPerPage - 1 Then
intStart = intCounter
e.HasMorePages = True
Exit For
End If
Next
End Using
If Not e.HasMorePages Then
' reset in case the user does a preview then a print etc.
intStart = 0
End If
End Sub
Private Sub bnPrint_Click(sender As Object, e As EventArgs) Handles bnPrint.Click
PrintDoc(PrintOperation.Print)
End Sub
Private Sub bnPreview_Click(sender As Object, e As EventArgs) Handles bnPreview.Click
PrintDoc(PrintOperation.Preview)
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' Create some test data...
For i = 1 To 100
lstLinesToPrint.Add("Line" & i)
Next
End Sub
End Class
我对您的代码进行了一些调整:字体需要使用.Dispose()才能在使用完毕后释放系统资源-Using
构造可解决此问题。我可以在其中放置更多的Using语句,但是有时我使用Try的Final子句代替。我更改了PrintDoc
的名称,因为它已经是我从不得不处理的其他程序中复制的方法的名称。
如果要保持以横向格式打印的可能性,请注意,如果以横向格式打印,则页边距符合预期(左边等),但是宽度和高度却是错误的。我没有更改显示的代码以考虑到这一点。
打印预览最后一页的示例输出: