欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

053打印对话框

程序员文章站 2024-03-08 09:23:58
...

1.打印结构

053打印对话框

  •     PrintDocument:打印的基类,也是打印过程中最重要的类。要打印一个文档,必须先创建一个该类的实例。通常,会创建PrintDocument类的实例,并设置对打印内容进行描述的属性,然后调用其Print()方法来实际打印文档。
  •     PrintController:控制打印任务流。打印控制器类PrintController提供了打印开始、打印每个页面和打印结束控制。该类是抽象类,真正完成打印任务的是具体类StandardPrintController和PreviewPrintController。
  •     PrinterSettings:使用PrinterSettings类可以获取打印和设置打印机配置。例如,双面打印,横向打印或纵向打印、打印份数等。该类的配置由PageSetupDialog类进行。
  •     PrintDialog:确定使用哪个打印机和如何配置PrinterSettings
  •     PageSettings:设置打印页面,可以设置页面是彩色还是黑白。该类的配置也由PageSetupDialog类进行。
  •     Graphics:使该类可以访问打印机的设备内容,为打印机发送字符串、线条和曲线。

 这些类按照下图所示的打印序列来完成打印任务。
053打印对话框

    应用程序必须先调用PrintDocument的Print()方法,以启动打印序列。因为PrintDocument本身并不负责打印流,所以会调用打印控制器PrintController类的OnStartPrint、OnEndPrint、OnStartPage和OnEndPage方法,指示打印机如何打印文档。
    打印控制器PrintController通过调用OnBeginPrint()方法通知PrintDocument开始打印。如果应用程序应在打印任务的开始执行时某些操作,就必须在PrintDocument中注册一个事件处理程序,这样才会在应用程序中接到通知消息。在图中,假定注册了处理程序OnBeginPrint(),那么在打印开始时PrintDocument类会调用应用程序的OnBeginPrint()方法。
    在开始阶段完成后,PrintController就进入PrintLoop(),为每个要打印的页面调用PrintDocument类的OnPrintPage()方法,而OnPrintPage()方法会调用所有的PrintPage事件处理程序。因此,必须对每个页面执行该处理程序,否则不会打印任何内容。在图中,该处理程序为nPrintPage()。
    在打印完最后一页后,PrintController就会调用PrintDocument类的OnEndPrint()方法,结束打印任务。
    总之,可以在PrintDocument.PrintPage处理程序中执行打印代码,每个要打印的页面都要调用该处理程序。如果打印任务只需要执行一次打印代码,就必须执行BeginPrint和EndPrint事件处理程序。
    PrintPage事件处理程序接收一个PrintPageEventArgs类型的参数。该类与PageSettings和Graphics类相关联:PageSettings类可以设置页面的大小、页边距,以及获取打印机的设备信息。另一方面,Grahics类可以访问打印机的设备内容,为打印机发送字符串、线条和曲线信息。

2.添加打印功能

        在添加PrintDialog之前先添加一些打印菜单项。为“文件菜单项添加两个分隔符,以及“页面设置”,  “打印预览”和
“打印”及“退出”菜单项。 
053打印对话框                      053打印对话框

    下面要为应用程序添加一个PrintDocument件,以添加打印功能。
    (1)在继续操作之前,将下面的Import语句添加到代码的开头,以便使用打印类:
               Imports System.Drawing.Printing
    (2)将PrintDocument控件添加到窗体设计器,将其Name属性修改为printDocument,为该控件添加PrintPage事件处理程序

 Private Sub printDocument_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles printDocument.PrintPage
        Dim lines() As String = txtBoxEdit.Text.Split(New Char() {Chr(10)})
        Dim i As Integer = 0
        For Each s As String In lines
            lines(i) = s.TrimEnd(Chr(13))
            i = i + 1
        Next
        Dim xPos As Integer
        Dim yPos As Integer
        Dim printfont As Font = txtBoxEdit.Font
        For Each line As String In lines
            e.Graphics.DrawString(line, printfont, Brushes.Black, xPos, yPos)
        Next
    End Sub

    在上面的事件处理程序中,使用String.Split()方法和换行符chr(10)逐行分解文本框中的文本,并将得到的文本逐行存储到字符串数组lines中。根据创建文本文件的方式,文本行可以使用换行符和回车符分隔,所以使用字符串类的TrimEnd()方法将各字符串末尾的回车符Chr(13)删除。
    在第二个ForEach循环中,遍历所有的文本行,调用e.Graphics.DrawString()方法,将每行文本发送到打印机,其中e是PrintPageEventArgs类型的一个变量,其属性连接到与打印机关联的文件中。
    (3)为“打印”菜单项添加Click事件处理程序,以调用PrintDocument类的Pnint()方法。如果未找到有效的打印机,则会抛出InvalidPrinterException类型的异常。

3.打印多个页面

     每个要打印的页面都会调用PrintPage事件,该事件的处理程序会接收一个PrintPageEventArgs类的实例。当PrintPageEventArgs类的HasMorePages属性为True时,PrintController会打印页面的附加页,即打印多个页面。

 下面修改程序,实现打印多个页面的功能。

(1)在类中声明一个字符串数组变量和整数变量。
           Private lines As String( )
           Private linesCounter As Integer  ’行记数器 
(2)修改printDocument_PrintPage处理程序,使用下面的代码替换原来的代码。

Private Sub printDocument_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles printDocument.PrintPage
        Dim xPos As Integer = 20
        Dim yPos As Integer = 20
        Dim printfont As Font = txtBoxEdit.Font

        While linesCount < lines.Length
            e.Graphics.DrawString(lines(linesCount), printfont, Brushes.Black, xPos, yPos)
            linesCount += 1
            yPos += 15
            If yPos >= e.PageBounds.Height - 80 Then
                e.HasMorePages = True
                Return
            End If
        End While
        linesCount = 0
        e.HasMorePages = False
End Sub

(3)为printDocument对象添加BeginPrint事件处理程序。每个打印任务只调用BeginPrint一次,在这里创建Lines数组。

Private Sub printDocument_BeginPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles printDocument.BeginPrint
        lines = txtBoxEdit.Text.Split(New Char() {Chr(10)})
        Dim i As Integer = 0
        For Each s As String In lines
            lines(i) = s.TrimEnd(Chr(13))
            i = i + 1
        Next
End Sub

       (4)为printDocument对象添加EndPrint事件处理程序EndPrint()。在该处理程序中释放在BeginPrint()方法中分配的资源。

4.页面设置

    PageSetupDialog类可以配置页面大小,纸张来源、方向和页边距,因此这些选项都依赖于打印机,所以在该对话框中还可以选择打印机。
053打印对话框
    当PageSetupDialog类的AllowPaper属性为True时,表示用户可以选择纸张大小和纸张来源。PageSetupDialog.PageSettings.PaperSize属性返回一个PaperSize实例,其属性Height、Width和PaperName可以读取高度、宽度和纸张名称(如A4、B5等名称)。
    PageSetupDialog类的AllowMargins属性为True时,将允许用户设置打印输出的页边距值。MinMargins属性可以为用户定义输入的最小页边距。要读取页边距时,可以使用PageSetupDialog.PageSettings.Margins属性,Margins类包含Bottom,Left、Right和Top属性。
    PageSetupDialog.AllowOrientation属性定义用户是否可以选择纵向和横向打印方式。当PageSetupDialog.PageSettings.Landscape的值为True时,表示用户指向横向打印,其值为False时,表示指定纵向打印。

    下面为程序添加打印页面设置功能。
    (1)向窗体设计器添加PageSetupDialog控件,将其Name属性修改为pageSetupDlg,Documenct属性修改为printDocument,将要打印的文档与对话框关联。
    (2)为‘‘页面设置”菜单项添加Click事件处理程序,使用ShowDialog()方法显示PageSetupDialog对话框。由于在该对话框中“确定”按钮的Click事件处理程序中关联的PrintDocument对象中设置了新值,因此不需要检查其返回值。
  (3)修改printDocument_PrintPage的执行代码,在打印时使用PageSetupDialog设置的页边距。

Private Sub printDocument_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles printDocument.PrintPage
        Dim xPos As Integer = e.MarginBounds.Left
        Dim yPos As Integer = e.MarginBounds.Top

        Dim printfont As Font = txtBoxEdit.Font

        While linesCount < lines.Length
            e.Graphics.DrawString(lines(linesCount), printfont, Brushes.Black, xPos, yPos)
            linesCount += 1
            yPos += 15
            If yPos >= e.PageBounds.Height - 80 Then
                e.HasMorePages = True
                Return
            End If
        End While
        linesCount = 0
        e.HasMorePages = False
    End Sub

5.打印设置

   PrintDialog控件允许用户选择想要使用的打印机,并设置打印机的一些属性,比如页面定向和打印质量,以及打印范围。PrintDialog提供了“确定’’和‘‘取消”按钮——这样会返回为DialogResult.OK或DialogResult.Cancel。

属性

AllowCurrentPage

获取或设置一个值,该值指示是否显示“当前页”选项按钮。

AllowPrintToFile

获取或设置一个值,该值指示是否启用“打印到文件”复选框。

AllowSelection

获取或设置一个值,该值指示是否启用“选择”选项按钮。

AllowSomePages

获取或设置一个值,该值指示是否启用“页”选项按钮。

    (1)PrintDialog控件添加到窗体中,将其名称修改为printDlg,将Document修改为printDocumento修改“打印”菜单项的Click事件处理程序:

Private Sub PrintMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PrintMenuItem.Click
        Try
            If txtBoxEdit.SelectedText <> "" Then
                PrintDlg.AllowSelection = True
            End If
            If PrintDlg.ShowDialog = DialogResult.OK Then
                printDocument.Print()
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message, "文本编辑器", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

    (2)在程序中,所有要打印的文本行都是在OnBeginPtint()处理程序中设置的。修改该方法的代码:

    Private Sub printDocument_BeginPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles printDocument.BeginPrint
        If PrintDlg.PrinterSettings.PrintRange = PrintRange.Selection Then
            lines = txtBoxEdit.SelectedText.Split(New Char() {Chr(10)})
        Else
            lines = txtBoxEdit.Text.Split(New Char() {Chr(10)})
        End If

        Dim i As Integer = 0
        For Each s As String In lines
            lines(i) = s.TrimEnd(Chr(13))
            i = i + 1
        Next
    End Sub

6.打印预览

    使用打印预览可以查看打印的效果。在.NET中实现打印预览非常简单,可以使用PrintPreviewControl和PrintPreviewDialog类。其中,PrintPreviewControl类可以在窗体中预览文档,演示如何打印文档。PrintPreviewDialog则为包含用于从Windows窗体应用程序中进行打印的PrintPreviewControl的对话框窗体。
    (1)将PrintPreviewDialog控件添加到窗体设计器中,将其名称修改为PrintPreviewDlg,将Document属性设置为printDocument。
    (2)为“打印预览”菜单项添加Click事件处理程序。
 

Private Sub PrintPreviewMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PrintPreviewMenuItem.Click
        PrintPreviewDlg.ShowDialog()
    End Sub

    Word中的打印预览与PrintPreviewDialog不同,因为在这些应用程序中,预览页面不是在另外的对话框中显示,而是在应用程序的主窗口中显示。PrintPreviewControl类可以实现类似于Word中的打印预览功能。使用PrintPreviewControl类时,只需要将Document属性设置为PrintDocument对象,将Visible属性设置为False。要显示打印预览的结果时,可以将Visible属性设置为True。