
自己设计的一个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

|