65.9K
CodeProject 正在变化。 阅读更多。
Home

基本文本和图像打印

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.45/5 (17投票s)

2006年12月10日

CPOL

3分钟阅读

viewsIcon

200281

downloadIcon

7526

本文将教你使用 PrintDocument、PrintDialog、PrintPreview 和 PageSetup 控件打印文本和图形的基础知识。

Sample Image - Screen1.jpg

引言

打印可能是一个复杂的过程,这取决于你想要打印的内容以及你希望如何配置它。幸运的是,.NET 2.0 帮助简化了这个过程,但有时它仍然会让人有点困惑,尤其是在处理高级打印配置时。因此,本文将向你展示从哪里开始打印过程。

开始

现在开始,你将不得不包含 .NET Framework 的一个主要部分,System.Drawing.Printing,它处理所有通用打印。并且,你的表单中必须添加四个控件:PrintDocumentPrintDialogPrintPreviewPageSetup 控件。现在,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 控件,这将允许你在打印页面之前查看文本的外观。用于此目的的实际对话框看起来不像所有其他对话框那么漂亮。对话框将如下所示

Screenshot - Screen2.jpg

现在,调用将向预览控件发送文本和字体设置的代码

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

窗口将如下所示

Screenshot - Screen3.jpg

最后,在开始实际打印之前,你必须调用 PrintDocument 控件来开始打印。在这里,当单击按钮 BeginTextPrint 时,它将显示一个 Print 对话框,其外观如下

Screenshot - Screen4.jpg

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 控件中设置属性的原因是,程序不必设置字体、行/字母间距等给打印控件,这与文本打印不同。

结论

除了编码之外,对打印的解释也很困难。代码中的注释应该为你提供有关所有内容如何工作的更多解释。此外,在示例程序中,我包含了一个字体对话框,以给你一个如何打印不同类型字体以及不同颜色的示例。

© . All rights reserved.