自己设计的一个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
<System.Diagnostics.DebuggerStepThrough()> 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