基本文本和图像打印






4.45/5 (17投票s)
本文将教你使用 PrintDocument、PrintDialog、PrintPreview 和 PageSetup 控件打印文本和图形的基础知识。
引言
打印可能是一个复杂的过程,这取决于你想要打印的内容以及你希望如何配置它。幸运的是,.NET 2.0 帮助简化了这个过程,但有时它仍然会让人有点困惑,尤其是在处理高级打印配置时。因此,本文将向你展示从哪里开始打印过程。
开始
现在开始,你将不得不包含 .NET Framework 的一个主要部分,System.Drawing.Printing
,它处理所有通用打印。并且,你的表单中必须添加四个控件:PrintDocument
、PrintDialog
、PrintPreview
和 PageSetup
控件。现在,PrintDialog
控件不是必需的,但包含它是一个好主意,因为它允许用户选择打印机属性、页面编号以及许多其他基本选项。
设置打印
现在,你将不得不准备好一切来打印你的文档。TextPrint
过程将设置要打印的文本、字体和打印颜色,以及 Brush
颜色。像这样
Private Sub TextPrint(ByVal sender As Object, ByVal e As PrintPageEventArgs)
e.Graphics.DrawString(TextToPrint.Text, _
New Font(TextToPrint.Font, TextToPrint.Font.Style), Brushes.Black, 120, 120)
e.HasMorePages = False
End Sub
接下来,你将调用 PrintPreview
控件,这将允许你在打印页面之前查看文本的外观。用于此目的的实际对话框看起来不像所有其他对话框那么漂亮。对话框将如下所示
现在,调用将向预览控件发送文本和字体设置的代码
Private Sub PreviewText_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles PreviewText.Click
Try
PrintTextControl.DefaultPageSettings = PrintPageSettings
PrintString = TextToPrint.Text
PreviewPrint.Document = PrintTextControl
PreviewPrint.ShowDialog()
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
接下来是 PageSetup
控件,它非常简单。你所要做的就是将控件中选择的所有设置发送到 PrintDocument
控件。
Private Sub PageSetup_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles PageSetup.Click
Try
SetupPage.PageSettings = PrintPageSettings
SetupPage.ShowDialog()
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
窗口将如下所示
最后,在开始实际打印之前,你必须调用 PrintDocument
控件来开始打印。在这里,当单击按钮 BeginTextPrint 时,它将显示一个 Print 对话框,其外观如下
Private Sub BeginTextPrint_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles BeginTextPrint.Click
If PrintWin.ShowDialog = Windows.Forms.DialogResult.OK Then
Try
AddHandler PrintTextControl.PrintPage, AddressOf Me.TextPrint
PrintTextControl.Print()
Catch ex As Exception
MsgBox(ex.Message)
End Try
End If
End Sub
打印文本
我们现在完成了所有准备工作,并准备好进行实际打印。对于某些人来说,这是可能会让人困惑的地方。在 PrintDocument.PrintPage
(PrintTextControl
) 中,你将使用以下代码
Private Sub PrintTextControl_PrintPage(ByVal sender As System.Object, _
ByVal e As System.Drawing.Printing.PrintPageEventArgs)_
Handles PrintTextControl.PrintPage
PrintTextControl.DocumentName = "Test Document"
Dim PrintFont As New Font(TextToPrint.Font, TextToPrint.Font.Style)
Dim numChars As Integer
Dim numLines As Integer
Dim stringForPage As String
Dim strFormat As New StringFormat
Dim rectDraw As New RectangleF(e.MarginBounds.Left, _
e.MarginBounds.Top, e.MarginBounds.Width, e.MarginBounds.Height)
'Determine maximum text ammount and spaces lines
Dim sizeMeasure As New SizeF(e.MarginBounds.Width, _
e.MarginBounds.Height - PrintFont.GetHeight(e.Graphics))
'Break in between words
strFormat.Trimming = StringTrimming.Word
'Determines ammount of words and lines that can fit on a page
e.Graphics.MeasureString(PrintString, PrintFont, sizeMeasure, _
strFormat, numChars, numLines)
stringForPage = PrintString.Substring(0, numChars)
'Print strings to page
e.Graphics.DrawString(stringForPage, PrintFont, _
Brushes.Black, rectDraw, strFormat)
'Determine whether or not there are more pages to print
If numChars < PrintString.Length Then
'Remove printed text from string
PrintString = PrintString.Substring(numChars)
e.HasMorePages = True
Else
e.HasMorePages = False
'Restore string after printing
PrintString = TextToPrint.Text
End If
End Sub
上面的代码中的所有内容都设置了页面属性,并获取由其他控件、用户和对话框设置的设置,将它们放在一起,设置页面(行/字母间距)和字体。这是大多数配置发生的地方。
现在,关于所有设置。PrintTextControl.DocumentName
设置要打印的文档的名称。如果用户在打印后台处理程序中有多个文档排队,以便他们可以区分哪个文档是哪个文档,这也很有用。StringTrimming
设置可以适合单个页面的单词和行的数量。
打印图形
打印图形与打印文本(对于基本配置)没有太大区别。你所要做的就是使用以下代码
Private Sub GraphicPrint(ByVal sender As Object, ByVal e As PrintPageEventArgs)
e.Graphics.DrawImage(Image.FromFile(GraphicLocation.Text), _
e.Graphics.VisibleClipBounds)
e.HasMorePages = False
End Sub
Private Sub BeginGraphicPrint_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles BeginGraphicPrint.Click
Try
AddHandler PrintGraphicControl.PrintPage, AddressOf Me.GraphicPrint
PrintGraphicControl.Print()
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
这基本上与用于文本打印的第一段代码相同,只有几个修改。主要的关键是,你将不得不为图形打印使用一个单独的 PrintDocument
控件。并且,你不需要向其中添加任何设置(对于基本配置)。打印图形不需要在其 PrintDocument
控件中设置属性的原因是,程序不必设置字体、行/字母间距等给打印控件,这与文本打印不同。
结论
除了编码之外,对打印的解释也很困难。代码中的注释应该为你提供有关所有内容如何工作的更多解释。此外,在示例程序中,我包含了一个字体对话框,以给你一个如何打印不同类型字体以及不同颜色的示例。