设计自己的printpreviewdialog

![图片](http://dev.csdn.net/article/58/C:/Documents and Settings\Administrator\My Documents\My Pictures\printpreviewcontrol.jpg)

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

  1<system.diagnostics.debuggerstepthrough()> Private Sub InitializeComponent()   
  2Me.PrintPreviewControl1 = New System.Windows.Forms.PrintPreviewControl   
  3Me.printsetup = New dbcbutton.dbcbutton   
  4Me.pagesetup = New dbcbutton.dbcbutton   
  5Me.pagecount = New System.Windows.Forms.NumericUpDown   
  6Me.pageroom = New System.Windows.Forms.ComboBox   
  7Me.Label1 = New System.Windows.Forms.Label   
  8Me.Label2 = New System.Windows.Forms.Label   
  9Me.Label3 = New System.Windows.Forms.Label   
 10Me.openfile = New dbcbutton.dbcbutton   
 11Me.setfont = New dbcbutton.dbcbutton   
 12Me.printthis = New dbcbutton.dbcbutton   
 13CType(Me.pagecount, System.ComponentModel.ISupportInitialize).BeginInit()   
 14Me.SuspendLayout()   
 15'   
 16'PrintPreviewControl1   
 17'   
 18Me.PrintPreviewControl1.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _   
 19Or System.Windows.Forms.AnchorStyles.Left) _   
 20Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)   
 21Me.PrintPreviewControl1.AutoZoom = False   
 22Me.PrintPreviewControl1.Location = New System.Drawing.Point(8, 40)   
 23Me.PrintPreviewControl1.Name = "PrintPreviewControl1"   
 24Me.PrintPreviewControl1.Size = New System.Drawing.Size(696, 280)   
 25Me.PrintPreviewControl1.TabIndex = 0   
 26Me.PrintPreviewControl1.Zoom = 0.3   
 27'   
 28'printsetup   
 29'   
 30Me.printsetup.BackColor = System.Drawing.SystemColors.Control   
 31Me.printsetup.ButtonStyle = dbcbutton.dbcbutton.Style.RectStyle   
 32Me.printsetup.GrayColor = System.Drawing.Color.BurlyWood   
 33Me.printsetup.LightColor = System.Drawing.Color.White   
 34Me.printsetup.Location = New System.Drawing.Point(168, 8)   
 35Me.printsetup.mytext = "打印设置"   
 36Me.printsetup.Name = "printsetup"   
 37Me.printsetup.Size = New System.Drawing.Size(72, 24)   
 38Me.printsetup.TabIndex = 1   
 39'   
 40'pagesetup   
 41'   
 42Me.pagesetup.BackColor = System.Drawing.SystemColors.Control   
 43Me.pagesetup.ButtonStyle = dbcbutton.dbcbutton.Style.RectStyle   
 44Me.pagesetup.GrayColor = System.Drawing.Color.BurlyWood   
 45Me.pagesetup.LightColor = System.Drawing.Color.White   
 46Me.pagesetup.Location = New System.Drawing.Point(256, 8)   
 47Me.pagesetup.mytext = "页面设置"   
 48Me.pagesetup.Name = "pagesetup"   
 49Me.pagesetup.Size = New System.Drawing.Size(72, 24)   
 50Me.pagesetup.TabIndex = 2   
 51'   
 52'pagecount   
 53'   
 54Me.pagecount.Location = New System.Drawing.Point(624, 11)   
 55Me.pagecount.Minimum = New Decimal(New Integer() {1, 0, 0, 0})   
 56Me.pagecount.Name = "pagecount"   
 57Me.pagecount.Size = New System.Drawing.Size(40, 21)   
 58Me.pagecount.TabIndex = 3   
 59Me.pagecount.Value = New Decimal(New Integer() {1, 0, 0, 0})   
 60'   
 61'pageroom   
 62'   
 63Me.pageroom.Items.AddRange(New Object() {"25%", "50%", "75%", "100%"})   
 64Me.pageroom.Location = New System.Drawing.Point(512, 12)   
 65Me.pageroom.Name = "pageroom"   
 66Me.pageroom.Size = New System.Drawing.Size(56, 20)   
 67Me.pageroom.TabIndex = 4   
 68Me.pageroom.Text = "缩放"   
 69'   
 70'Label1   
 71'   
 72Me.Label1.Location = New System.Drawing.Point(456, 16)   
 73Me.Label1.Name = "Label1"   
 74Me.Label1.Size = New System.Drawing.Size(48, 16)   
 75Me.Label1.TabIndex = 5   
 76Me.Label1.Text = "缩放:"   
 77Me.Label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter   
 78'   
 79'Label2   
 80'   
 81Me.Label2.Location = New System.Drawing.Point(584, 16)   
 82Me.Label2.Name = "Label2"   
 83Me.Label2.Size = New System.Drawing.Size(32, 16)   
 84Me.Label2.TabIndex = 6   
 85Me.Label2.Text = "第"   
 86Me.Label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter   
 87'   
 88'Label3   
 89'   
 90Me.Label3.Location = New System.Drawing.Point(672, 16)   
 91Me.Label3.Name = "Label3"   
 92Me.Label3.Size = New System.Drawing.Size(32, 16)   
 93Me.Label3.TabIndex = 7   
 94Me.Label3.Text = "页"   
 95Me.Label3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter   
 96'   
 97'openfile   
 98'   
 99Me.openfile.BackColor = System.Drawing.SystemColors.Control   
100Me.openfile.ButtonStyle = dbcbutton.dbcbutton.Style.RectStyle   
101Me.openfile.GrayColor = System.Drawing.Color.BurlyWood   
102Me.openfile.LightColor = System.Drawing.Color.White   
103Me.openfile.Location = New System.Drawing.Point(8, 8)   
104Me.openfile.mytext = "选择文件"   
105Me.openfile.Name = "openfile"   
106Me.openfile.Size = New System.Drawing.Size(72, 24)   
107Me.openfile.TabIndex = 8   
108'   
109'setfont   
110'   
111Me.setfont.BackColor = System.Drawing.SystemColors.Control   
112Me.setfont.ButtonStyle = dbcbutton.dbcbutton.Style.RectStyle   
113Me.setfont.GrayColor = System.Drawing.Color.BurlyWood   
114Me.setfont.LightColor = System.Drawing.Color.White   
115Me.setfont.Location = New System.Drawing.Point(88, 8)   
116Me.setfont.mytext = "设置字体"   
117Me.setfont.Name = "setfont"   
118Me.setfont.Size = New System.Drawing.Size(72, 24)   
119Me.setfont.TabIndex = 9   
120'   
121'printthis   
122'   
123Me.printthis.BackColor = System.Drawing.SystemColors.Control   
124Me.printthis.ButtonStyle = dbcbutton.dbcbutton.Style.RectStyle   
125Me.printthis.GrayColor = System.Drawing.Color.BurlyWood   
126Me.printthis.LightColor = System.Drawing.Color.White   
127Me.printthis.Location = New System.Drawing.Point(344, 8)   
128Me.printthis.mytext = "开始打印"   
129Me.printthis.Name = "printthis"   
130Me.printthis.Size = New System.Drawing.Size(72, 24)   
131Me.printthis.TabIndex = 10   
132'   
133'previewcontrol   
134'   
135Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)   
136Me.ClientSize = New System.Drawing.Size(712, 325)   
137Me.Controls.Add(Me.printthis)   
138Me.Controls.Add(Me.setfont)   
139Me.Controls.Add(Me.openfile)   
140Me.Controls.Add(Me.Label3)   
141Me.Controls.Add(Me.Label2)   
142Me.Controls.Add(Me.Label1)   
143Me.Controls.Add(Me.pageroom)   
144Me.Controls.Add(Me.pagecount)   
145Me.Controls.Add(Me.pagesetup)   
146Me.Controls.Add(Me.printsetup)   
147Me.Controls.Add(Me.PrintPreviewControl1)   
148Me.Name = "previewcontrol"   
149Me.Text = "previewcontrol"   
150CType(Me.pagecount, System.ComponentModel.ISupportInitialize).EndInit()   
151Me.ResumeLayout(False) 
152
153End Sub 
154
155#End Region   
156Private printstream As StreamReader   
157Private printfont As Font   
158Dim newprintdocument As New PrintDocument   
159Private totalpage As Single = 0 '存放总页数   
160Private Sub previewcontrol_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load   
161AddHandler newprintdocument.PrintPage, AddressOf newprintdocument_printpage   
162End Sub 
163
164'页面的printpage函数   
165Private Sub newprintdocument_printpage(ByVal sender As Object, ByVal ev As PrintPageEventArgs)   
166Try   
167totalpage += 1   
168If printstream.ReadLine Is Nothing Then   
169MsgBox("无内容")   
170Exit Sub   
171End If 
172
173If printfont Is Nothing Then   
174printfont = New Font("宋体", 12)   
175End If 
176
177Dim pagelines As Single '存放每页可打印的行数   
178Dim lineheight As Single = printfont.GetHeight(ev.Graphics) '存放行高   
179Dim xpos As Single = 0 '存放每行打印的X坐标   
180Dim ypos As Single = 0 '存放每行打印的Y坐标   
181Dim linecount As Single = 0 '存放已经打印的行数   
182Dim strformat As New StringFormat   
183Dim left As Single = ev.MarginBounds.Left   
184Dim top As Single = ev.MarginBounds.Top   
185strformat.FormatFlags = StringFormatFlags.LineLimit   
186Dim printbrush As Brush   
187printbrush = New SolidBrush(Color.Black)   
188pagelines = ev.MarginBounds.Height / lineheight   
189Dim strline As String = Nothing   
190Do While linecount &lt; pagelines   
191strline = printstream.ReadLine   
192If strline Is Nothing Then   
193Exit Do   
194End If   
195top = ev.MarginBounds.Top + linecount * lineheight   
196ev.Graphics.DrawString(strline, printfont, printbrush, left, top, strformat)   
197linecount = linecount + 1   
198Loop   
199If strline Is Nothing Then   
200ev.HasMorePages = False   
201Else   
202ev.HasMorePages = True 
203
204End If   
205Catch ex As Printing.InvalidPrinterException   
206MsgBox(ex.Message, MsgBoxStyle.OKOnly, "打印出错")   
207MsgBox(ex.Source)   
208Catch ex1 As Exception   
209MsgBox(ex1.Message)   
210MsgBox(ex1.Source)   
211End Try   
212pagecount.Maximum = totalpage   
213pagecount.Minimum = 1   
214End Sub 
215
216'打开文件,读取文件流,开始填充打印页面   
217Private Sub openfile_onclick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles openfile.Click   
218totalpage = 0   
219If Not (printstream Is Nothing) Then   
220printstream.Close()   
221End If   
222Dim filedialog As New OpenFileDialog   
223If filedialog.ShowDialog = DialogResult.OK Then   
224printstream = New StreamReader(filedialog.FileName)   
225PrintPreviewControl1.Document = newprintdocument   
226PrintPreviewControl1.Zoom = 1   
227End If   
228End Sub 
229
230'字体设置对话框   
231Private Sub setfont_onclick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles setfont.Click   
232Dim setfontdialog As New FontDialog   
233If setfontdialog.ShowDialog = DialogResult.OK Then   
234totalpage = 0   
235printstream.BaseStream.Seek(0, SeekOrigin.Begin)   
236printfont = setfontdialog.Font   
237PrintPreviewControl1.InvalidatePreview()   
238Me.Refresh()   
239End If   
240End Sub 
241
242'打印设置对话框   
243Private Sub printsetup_onclick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles printsetup.Click   
244Dim printsetup As New PrintDialog   
245printsetup.Document = newprintdocument   
246If printsetup.ShowDialog = DialogResult.OK Then   
247totalpage = 0   
248printstream.BaseStream.Seek(0, SeekOrigin.Begin)   
249PrintPreviewControl1.InvalidatePreview()   
250Me.Refresh()   
251End If   
252End Sub 
253
254'页面设置对话框   
255Private Sub pagesetup_onclick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles pagesetup.Click   
256Dim pagesetup As New PageSetupDialog   
257pagesetup.Document = newprintdocument   
258If pagesetup.ShowDialog = DialogResult.OK Then   
259totalpage = 0   
260printstream.BaseStream.Seek(0, SeekOrigin.Begin)   
261PrintPreviewControl1.InvalidatePreview()   
262Me.Refresh()   
263End If   
264End Sub 
265
266'打印文档   
267Private Sub printthis_onclick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles printthis.Click   
268newprintdocument.Print()   
269End Sub 
270
271'当窗口关闭时关闭文档流   
272Private Sub previewcontrol_onclose(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed   
273If Not (printstream Is Nothing) Then   
274printstream.Close()   
275End If   
276End Sub 
277
278'改变当前显示的页面   
279Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles pagecount.ValueChanged   
280PrintPreviewControl1.StartPage = pagecount.Value - 1   
281End Sub 
282
283'改变显示比例   
284Private Sub pageroom_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles pageroom.SelectedIndexChanged   
285Select Case pageroom.Items(pageroom.SelectedIndex)   
286Case "25%"   
287PrintPreviewControl1.Zoom = 0.25   
288PrintPreviewControl1.Refresh()   
289Me.Refresh()   
290Case "50%"   
291PrintPreviewControl1.Zoom = 0.5   
292PrintPreviewControl1.Refresh()   
293Me.Refresh()   
294Case "75%"   
295PrintPreviewControl1.Zoom = 0.75   
296PrintPreviewControl1.Refresh()   
297Me.Refresh()   
298Case "100%"   
299PrintPreviewControl1.Zoom = 1   
300PrintPreviewControl1.Refresh()   
301Me.Refresh()   
302End Select   
303End Sub   
304End Class</system.diagnostics.debuggerstepthrough()>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus