2011年11月24日 星期四

自己设计的一个printpreview程序

參考引用
--
 自己设计的一个printpreview程序,最大的特点是把页面设置,打印设置,字体设置整合到一个窗口中了。还有很多问题,希望高手指点一二。
源代码:

Imports System.Drawing.printing
Imports System.io
Public Class previewcontrol
    Inherits System.Windows.Forms.Form

#Region " Windows 窗体设计器生成的代码 "

    Public Sub New()
        MyBase.New()

        '该调用是 Windows 窗体设计器所必需的。
        InitializeComponent()

        '在 InitializeComponent() 调用之后添加任何初始化

    End Sub

    '窗体重写 dispose 以清理组件列表。
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Windows 窗体设计器所必需的
    Private components As System.ComponentModel.IContainer

    '注意: 以下过程是 Windows 窗体设计器所必需的
    '可以使用 Windows 窗体设计器修改此过程。
    '不要使用代码编辑器修改它。
    Friend WithEvents PrintPreviewControl1 As System.Windows.Forms.PrintPreviewControl
    Friend WithEvents printsetup As dbcbutton.dbcbutton
    Private WithEvents pagesetup As dbcbutton.dbcbutton
    Friend WithEvents Label1 As System.Windows.Forms.Label
    Friend WithEvents Label2 As System.Windows.Forms.Label
    Friend WithEvents Label3 As System.Windows.Forms.Label
    Friend WithEvents openfile As dbcbutton.dbcbutton
    Friend WithEvents setfont As dbcbutton.dbcbutton
    Friend WithEvents printthis As dbcbutton.dbcbutton
    Friend WithEvents pagecount As System.Windows.Forms.NumericUpDown
    Friend WithEvents pageroom As System.Windows.Forms.ComboBox
     Private Sub InitializeComponent()
        Me.PrintPreviewControl1 = New System.Windows.Forms.PrintPreviewControl
        Me.printsetup = New dbcbutton.dbcbutton
        Me.pagesetup = New dbcbutton.dbcbutton
        Me.pagecount = New System.Windows.Forms.NumericUpDown
        Me.pageroom = New System.Windows.Forms.ComboBox
        Me.Label1 = New System.Windows.Forms.Label
        Me.Label2 = New System.Windows.Forms.Label
        Me.Label3 = New System.Windows.Forms.Label
        Me.openfile = New dbcbutton.dbcbutton
        Me.setfont = New dbcbutton.dbcbutton
        Me.printthis = New dbcbutton.dbcbutton
        CType(Me.pagecount, System.ComponentModel.ISupportInitialize).BeginInit()
        Me.SuspendLayout()
        '
        'PrintPreviewControl1
        '
        Me.PrintPreviewControl1.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
                    Or System.Windows.Forms.AnchorStyles.Left) _
                    Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
        Me.PrintPreviewControl1.AutoZoom = False
        Me.PrintPreviewControl1.Location = New System.Drawing.Point(8, 40)
        Me.PrintPreviewControl1.Name = "PrintPreviewControl1"
        Me.PrintPreviewControl1.Size = New System.Drawing.Size(696, 280)
        Me.PrintPreviewControl1.TabIndex = 0
        Me.PrintPreviewControl1.Zoom = 0.3
        '
        'printsetup
        '
        Me.printsetup.BackColor = System.Drawing.SystemColors.Control
        Me.printsetup.ButtonStyle = dbcbutton.dbcbutton.Style.RectStyle
        Me.printsetup.GrayColor = System.Drawing.Color.BurlyWood
        Me.printsetup.LightColor = System.Drawing.Color.White
        Me.printsetup.Location = New System.Drawing.Point(168, 8)
        Me.printsetup.mytext = "打印设置"
        Me.printsetup.Name = "printsetup"
        Me.printsetup.Size = New System.Drawing.Size(72, 24)
        Me.printsetup.TabIndex = 1
        '
        'pagesetup
        '
        Me.pagesetup.BackColor = System.Drawing.SystemColors.Control
        Me.pagesetup.ButtonStyle = dbcbutton.dbcbutton.Style.RectStyle
        Me.pagesetup.GrayColor = System.Drawing.Color.BurlyWood
        Me.pagesetup.LightColor = System.Drawing.Color.White
        Me.pagesetup.Location = New System.Drawing.Point(256, 8)
        Me.pagesetup.mytext = "页面设置"
        Me.pagesetup.Name = "pagesetup"
        Me.pagesetup.Size = New System.Drawing.Size(72, 24)
        Me.pagesetup.TabIndex = 2
        '
        'pagecount
        '
        Me.pagecount.Location = New System.Drawing.Point(624, 11)
        Me.pagecount.Minimum = New Decimal(New Integer() {1, 0, 0, 0})
        Me.pagecount.Name = "pagecount"
        Me.pagecount.Size = New System.Drawing.Size(40, 21)
        Me.pagecount.TabIndex = 3
        Me.pagecount.Value = New Decimal(New Integer() {1, 0, 0, 0})
        '
        'pageroom
        '
        Me.pageroom.Items.AddRange(New Object() {"25%", "50%", "75%", "100%"})
        Me.pageroom.Location = New System.Drawing.Point(512, 12)
        Me.pageroom.Name = "pageroom"
        Me.pageroom.Size = New System.Drawing.Size(56, 20)
        Me.pageroom.TabIndex = 4
        Me.pageroom.Text = "缩放"
        '
        'Label1
        '
        Me.Label1.Location = New System.Drawing.Point(456, 16)
        Me.Label1.Name = "Label1"
        Me.Label1.Size = New System.Drawing.Size(48, 16)
        Me.Label1.TabIndex = 5
        Me.Label1.Text = "缩放:"
        Me.Label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
        '
        'Label2
        '
        Me.Label2.Location = New System.Drawing.Point(584, 16)
        Me.Label2.Name = "Label2"
        Me.Label2.Size = New System.Drawing.Size(32, 16)
        Me.Label2.TabIndex = 6
        Me.Label2.Text = "第"
        Me.Label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
        '
        'Label3
        '
        Me.Label3.Location = New System.Drawing.Point(672, 16)
        Me.Label3.Name = "Label3"
        Me.Label3.Size = New System.Drawing.Size(32, 16)
        Me.Label3.TabIndex = 7
        Me.Label3.Text = "页"
        Me.Label3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
        '
        'openfile
        '
        Me.openfile.BackColor = System.Drawing.SystemColors.Control
        Me.openfile.ButtonStyle = dbcbutton.dbcbutton.Style.RectStyle
        Me.openfile.GrayColor = System.Drawing.Color.BurlyWood
        Me.openfile.LightColor = System.Drawing.Color.White
        Me.openfile.Location = New System.Drawing.Point(8, 8)
        Me.openfile.mytext = "选择文件"
        Me.openfile.Name = "openfile"
        Me.openfile.Size = New System.Drawing.Size(72, 24)
        Me.openfile.TabIndex = 8
        '
        'setfont
        '
        Me.setfont.BackColor = System.Drawing.SystemColors.Control
        Me.setfont.ButtonStyle = dbcbutton.dbcbutton.Style.RectStyle
        Me.setfont.GrayColor = System.Drawing.Color.BurlyWood
        Me.setfont.LightColor = System.Drawing.Color.White
        Me.setfont.Location = New System.Drawing.Point(88, 8)
        Me.setfont.mytext = "设置字体"
        Me.setfont.Name = "setfont"
        Me.setfont.Size = New System.Drawing.Size(72, 24)
        Me.setfont.TabIndex = 9
        '
        'printthis
        '
        Me.printthis.BackColor = System.Drawing.SystemColors.Control
        Me.printthis.ButtonStyle = dbcbutton.dbcbutton.Style.RectStyle
        Me.printthis.GrayColor = System.Drawing.Color.BurlyWood
        Me.printthis.LightColor = System.Drawing.Color.White
        Me.printthis.Location = New System.Drawing.Point(344, 8)
        Me.printthis.mytext = "开始打印"
        Me.printthis.Name = "printthis"
        Me.printthis.Size = New System.Drawing.Size(72, 24)
        Me.printthis.TabIndex = 10
        '
        'previewcontrol
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
        Me.ClientSize = New System.Drawing.Size(712, 325)
        Me.Controls.Add(Me.printthis)
        Me.Controls.Add(Me.setfont)
        Me.Controls.Add(Me.openfile)
        Me.Controls.Add(Me.Label3)
        Me.Controls.Add(Me.Label2)
        Me.Controls.Add(Me.Label1)
        Me.Controls.Add(Me.pageroom)
        Me.Controls.Add(Me.pagecount)
        Me.Controls.Add(Me.pagesetup)
        Me.Controls.Add(Me.printsetup)
        Me.Controls.Add(Me.PrintPreviewControl1)
        Me.Name = "previewcontrol"
        Me.Text = "previewcontrol"
        CType(Me.pagecount, System.ComponentModel.ISupportInitialize).EndInit()
        Me.ResumeLayout(False)

    End Sub

#End Region
    Private printstream As StreamReader
    Private printfont As Font
    Dim newprintdocument As New PrintDocument
    Private totalpage As Single = 0 '存放总页数
    Private Sub previewcontrol_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        AddHandler newprintdocument.PrintPage, AddressOf newprintdocument_printpage
    End Sub

    '页面的printpage函数
    Private Sub newprintdocument_printpage(ByVal sender As Object, ByVal ev As PrintPageEventArgs)
        Try
            totalpage += 1
            If printstream.ReadLine Is Nothing Then
                MsgBox("无内容")
                Exit Sub
            End If

            If printfont Is Nothing Then
                printfont = New Font("宋体", 12)
            End If

            Dim pagelines As Single '存放每页可打印的行数
            Dim lineheight As Single = printfont.GetHeight(ev.Graphics) '存放行高
            Dim xpos As Single = 0 '存放每行打印的X坐标
            Dim ypos As Single = 0 '存放每行打印的Y坐标
            Dim linecount As Single = 0 '存放已经打印的行数
            Dim strformat As New StringFormat
            Dim left As Single = ev.MarginBounds.Left
            Dim top As Single = ev.MarginBounds.Top
            strformat.FormatFlags = StringFormatFlags.LineLimit
            Dim printbrush As Brush
            printbrush = New SolidBrush(Color.Black)
            pagelines = ev.MarginBounds.Height / lineheight
            Dim strline As String = Nothing
            Do While linecount < pagelines
                strline = printstream.ReadLine
                If strline Is Nothing Then
                    Exit Do
                End If
                top = ev.MarginBounds.Top + linecount * lineheight
                ev.Graphics.DrawString(strline, printfont, printbrush, left, top, strformat)
                linecount = linecount + 1
            Loop
            If strline Is Nothing Then
                ev.HasMorePages = False
            Else
                ev.HasMorePages = True

            End If
        Catch ex As Printing.InvalidPrinterException
            MsgBox(ex.Message, MsgBoxStyle.OKOnly, "打印出错")
            MsgBox(ex.Source)
        Catch ex1 As Exception
            MsgBox(ex1.Message)
            MsgBox(ex1.Source)
        End Try
        pagecount.Maximum = totalpage
        pagecount.Minimum = 1
    End Sub

    '打开文件,读取文件流,开始填充打印页面
    Private Sub openfile_onclick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles openfile.Click
        totalpage = 0
        If Not (printstream Is Nothing) Then
            printstream.Close()
        End If
        Dim filedialog As New OpenFileDialog
        If filedialog.ShowDialog = DialogResult.OK Then
            printstream = New StreamReader(filedialog.FileName)
            PrintPreviewControl1.Document = newprintdocument
            PrintPreviewControl1.Zoom = 1
        End If
    End Sub

    '字体设置对话框
    Private Sub setfont_onclick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles setfont.Click
        Dim setfontdialog As New FontDialog
        If setfontdialog.ShowDialog = DialogResult.OK Then
            totalpage = 0
            printstream.BaseStream.Seek(0, SeekOrigin.Begin)
            printfont = setfontdialog.Font
            PrintPreviewControl1.InvalidatePreview()
            Me.Refresh()
        End If
    End Sub

    '打印设置对话框
    Private Sub printsetup_onclick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles printsetup.Click
        Dim printsetup As New PrintDialog
        printsetup.Document = newprintdocument
        If printsetup.ShowDialog = DialogResult.OK Then
            totalpage = 0
            printstream.BaseStream.Seek(0, SeekOrigin.Begin)
            PrintPreviewControl1.InvalidatePreview()
            Me.Refresh()
        End If
    End Sub

    '页面设置对话框
    Private Sub pagesetup_onclick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles pagesetup.Click
        Dim pagesetup As New PageSetupDialog
        pagesetup.Document = newprintdocument
        If pagesetup.ShowDialog = DialogResult.OK Then
            totalpage = 0
            printstream.BaseStream.Seek(0, SeekOrigin.Begin)
            PrintPreviewControl1.InvalidatePreview()
            Me.Refresh()
        End If
    End Sub

    '打印文档
    Private Sub printthis_onclick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles printthis.Click
        newprintdocument.Print()
    End Sub

    '当窗口关闭时关闭文档流
    Private Sub previewcontrol_onclose(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed
        If Not (printstream Is Nothing) Then
            printstream.Close()
        End If
    End Sub

    '改变当前显示的页面
    Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles pagecount.ValueChanged
        PrintPreviewControl1.StartPage = pagecount.Value - 1
    End Sub

    '改变显示比例
    Private Sub pageroom_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles pageroom.SelectedIndexChanged
        Select Case pageroom.Items(pageroom.SelectedIndex)
            Case "25%"
                PrintPreviewControl1.Zoom = 0.25
                PrintPreviewControl1.Refresh()
                Me.Refresh()
            Case "50%"
                PrintPreviewControl1.Zoom = 0.5
                PrintPreviewControl1.Refresh()
                Me.Refresh()
            Case "75%"
                PrintPreviewControl1.Zoom = 0.75
                PrintPreviewControl1.Refresh()
                Me.Refresh()
            Case "100%"
                PrintPreviewControl1.Zoom = 1
                PrintPreviewControl1.Refresh()
                Me.Refresh()
        End Select
    End Sub
End Class

沒有留言:

張貼留言