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