如何实现VB.NET 打印控件的使用

system.drawing.printing  命名空间
printerSettings    打印机设置类
PageSettings      页面设置类
PrintPageEventArgs    要打印页的设置信息类
一、打印图片(加入控件printdocument1方法)

[html]  view plain copy print ?
  1. Public Class Form1  
  2.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click  
  3.         Try  
  4.             AddHandler PrintDocument1.PrintPage, AddressOf Me.PrintGraphics  
  5.             PrintDocument1.Print()  
  6.         Catch ex As Exception  
  7.             MsgBox(ex.Message)  
  8.         End Try  
  9.     End Sub  
  10.   
  11.     Private Sub PrintGraphics(ByVal sender As Object, ByVal ev As System.Drawing.Printing.PrintPageEventArgs)  
  12.         ev.Graphics.DrawImage(System.Drawing.Image.FromFile(TextBox1.Text), ev.Graphics.VisibleClipBounds)  
  13.         ev.HasMorePages = False  
  14.     End Sub  
  15. End Class  
二、打印文字(创建对象printdocument方法)
[html]  view plain copy print ?
  1. Public Class Form1  
  2.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click  
  3.         Try  
  4.             Dim printDoc As New System.Drawing.Printing.PrintDocument  
  5.             AddHandler printDoc.PrintPage, AddressOf Me.PrintText  
  6.             printDoc.Print()  
  7.         Catch ex As Exception  
  8.             MsgBox(ex.Message)  
  9.         End Try  
  10.     End Sub  
  11.   
  12.     Private Sub PrintText(ByVal sender As Object, ByVal ev As System.Drawing.Printing.PrintPageEventArgs)  
  13.         ev.Graphics.DrawString(TextBox1.Text, New Font("Arial", 11, FontStyle.Bold), Brushes.Black, 40, 40)  
  14.         ev.HasMorePages = False  
  15.     End Sub  
  16. End Class  

上面两个方法都是简单的方法,但有重大的缺点:
1、字符串不会自动转行,也就是说过长的字符串会“打印”到页面的“外面”去;
2、只能打印一页。
下面来解决上面两个问题。
三、完美打印过长的字符串(占有几页)

描述:open按钮打开一个对话框,选择一个文件,并将文本反映到richtextbox上。同时激活print,再按,就执行打印。

  1. Imports System.IO  
  2. Imports System.Drawing.Printing  
  3.   
  4. Public Class Form1  
  5.     Private PrintPageSettings As New PageSettings  
  6.     Private StringToPrint As String  
  7.     Private PrintFont As New Font("Arial", 10)  
  8.   
  9.     Private Sub btnOpen_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles btnOpen.Click  
  10.         Dim FilePath As String  
  11.         OpenFileDialog1.Filter = "Text files (*.txt)|*.txt"  
  12.         OpenFileDialog1.ShowDialog()  
  13.         If OpenFileDialog1.FileName <> "" Then  
  14.             FilePath = OpenFileDialog1.FileName  
  15.             Try  
  16.                 Dim MyFileStream As New FileStream(FilePath, FileMode.Open)  
  17.                 RichTextBox1.LoadFile(MyFileStream, RichTextBoxStreamType.PlainText)  
  18.                 MyFileStream.Close()  
  19.                 StringToPrint = RichTextBox1.Text '初始化打印字符串  
  20.                 btnPrint.Enabled = True  
  21.             Catch ex As Exception  
  22.                 MessageBox.Show(ex.Message)  
  23.             End Try  
  24.         End If  
  25.     End Sub  
  26.   
  27.     Private Sub btnPrint_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles btnPrint.Click  
  28.         Try  
  29.             '指定当前页设置  
  30.             PrintDocument1.DefaultPageSettings = PrintPageSettings  
  31.             '指定“打印”对话框的文档并显示  
  32.             StringToPrint = RichTextBox1.Text  
  33.             PrintDialog1.Document = PrintDocument1  
  34.             Dim result As DialogResult = PrintDialog1.ShowDialog()  
  35.             If result = DialogResult.OK Then  
  36.                 PrintDocument1.Print() '打印,并非由“打印”对话框控制.正如OpenFileDialog表现的形式一样。  
  37.             End If  
  38.         Catch ex As Exception  
  39.             MessageBox.Show(ex.Message)  
  40.         End Try  
  41.     End Sub  
  42.   
  43.     Private Sub PrintDocument1_PrintPage(ByVal sender As System.ObjectByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage  
  44.         Dim numChars As Integer  
  45.         Dim numLines As Integer  
  46.         Dim stringForPage As String  
  47.         Dim strFormat As New StringFormat  
  48.         '根据页面设置,定义可用的页面区域(打印区域)  
  49.         Dim rectDraw As New RectangleF(e.MarginBounds.Left, e.MarginBounds.Top, e.MarginBounds.Width, e.MarginBounds.Height)  
  50.         '定义区域,来确定一个页面可容纳多少文本,并使文本高度少一行,以免文本被减短  
  51.         Dim sizeMeasure As New SizeF(e.MarginBounds.Width, e.MarginBounds.Height - PrintFont.GetHeight(e.Graphics))  
  52.   
  53.         '处理长字符串时,按单词进行断开(换行)  
  54.         strFormat.Trimming = StringTrimming.Word  
  55.         '用MeasureString计算出可容纳的字符串个数numChars和行数numLines  
  56.         e.Graphics.MeasureString(StringToPrint, PrintFont, sizeMeasure, strFormat, numChars, numLines)  
  57.         '计算出适应页面的字符串  
  58.         stringForPage = StringToPrint.Substring(0, numChars)  
  59.         '(逻辑上)在当前页打印字符串  
  60.         e.Graphics.DrawString(stringForPage, PrintFont, Brushes.Black, rectDraw, strFormat)  
  61.         '若还有需要打印的文本,则继续处理剩下的页面  
  62.         If numChars < StringToPrint.Length Then  
  63.             '删除已经打印的字符串  
  64.             StringToPrint = StringToPrint.Substring(numChars)  
  65.             e.HasMorePages = True  
  66.         Else  
  67.             e.HasMorePages = False  
  68.             StringToPrint = RichTextBox1.Text  
  69.         End If  
  70.     End Sub  
  71. End Class  
开始读了N久没明白什么意思?看了一下午,再逐条进行调试才明白原来打印的原理是这样的:
1、首先Printdialog1打印对话框,只是设置选择哪个打印机,用哪种方式来打印(通过PrintDialog1.Document = PrintDocument1来进行关联),与具体打印的字符串无关。
2、关键:PrintPage事件发生在打印“当前”页面,也就是说打印3页,这个事件就会发生3次。每次可以通过此事件来设置页面内容(逻辑上)。这样就可以控制打印多页。
3、通过MeasureString来计算每页可容纳的字符串和行数,这样就很好的控制每页的具体字符串,循环这个方法计算剩下的字符进行每页设置并打印。
再增加两个按钮,一个页面设置,一个是页面预览,代码如下:
  1. Private Sub btnSetup_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles btnSetup.Click  
  2.     Try '页面设置  
  3.         PageSetupDialog1.PageSettings = PrintPageSettings  
  4.         PageSetupDialog1.ShowDialog()  
  5.     Catch ex As Exception  
  6.         MessageBox.Show(ex.Message)  
  7.     End Try  
  8. End Sub  
  9.   
  10. Private Sub btnPreview_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles btnPreview.Click  
  11.     Try '页面预览  
  12.         PrintDocument1.DefaultPageSettings = PrintPageSettings  
  13.         StringToPrint = RichTextBox1.Text  
  14.         PrintPreviewDialog1.Document = PrintDocument1  
  15.         PrintPreviewDialog1.ShowDialog()  
  16.     Catch ex As Exception  
  17.         MessageBox.Show(ex.Message)  
  18.     End Try  
  19. End Sub  

有过编程经验的人都知道,编写打印模块是非常头疼的事,本组件针对上述情况,作者根据自已在软件开发过程中积累的经验编制了一个通用的打印组件(ActiveX DLL),这个组件可用于软件开发中的打印模块的二次开发,它可实现1毫米精度的定位打印,可以完成各种类型报表的设计并打印,支持表格打印、多页打印、资料发票套打等。组件提供的接口允许程序员控制设计的打印模板中的各个对象的属性,在程序中就可以完成所在的数据处理,支持数据的合计值、平均值等操作。提供了打印定位微调等接口控制(软件用户自己就可以不同的打印机设置微调值,避免了常规要由程序员上门调试打印位置,有时还要根据不同的打印机更改源码的麻烦),实现对各种纸张及票据的精确定位打印,支持的打印对象除了文本文字以外,还支持直线、矩形、圆、填充矩形、填充圆、图象等的打印。 该组件库内嵌的打印预览功能,随时可以将程序对报表处理的情况进行实时预览。组件库内嵌的报表模板设计器,可以方便快速的设计出各种类型报表的模板,设计过程采用先进的所见即所得的方式,让您使用起来更加得心应手,报表可以由程序员设计也可以交由用户自己设计, 该组件支持VB、VC等开发工具,并提供了相关的示例工程源代码。 作者:罗伟 Email:mr_luowei@163.com
Private Sub Image5_Click() '打印报表 Dim i As Integer Dim pageleft As Integer Dim pageheader As Integer Dim pagefooter As Integer Dim pageright As Integer Dim startx As Integer Dim starty As Integer Dim startline As Integer Dim endline As Integer Dim usewidth As Integer Dim useheight As Integer pageheader = 25 pagefooter = 25 pageleft = 20 pageright = 20 '定义纸张类型A4 Printer.FontSize = 20 Printer.PaperSize = 9 Printer.ScaleMode = 6 Printer.FontBold = False Printer.ScaleLeft = -20 Printer.ScaleTop = -25 Printer.ScaleWidth = 210 Printer.ScaleHeight = 297 usewidth = Printer.ScaleWidth - 40 useheight = Printer.ScaleHeight - 50 Printer.CurrentX = 0 Printer.CurrentY = 0 Printer.DrawWidth = 2 '打印主标题 Printer.FontSize = 20 Printer.CurrentX = (usewidth - Printer.TextWidth(Me.Text1.Text & "经济情况表")) / 2 Printer.CurrentY = Printer.ScaleTop Printer.Print Me.Text1.Text & "经济情况表" '打印空白行 Printer.FontSize = 8 Printer.CurrentX = (usewidth - Printer.TextWidth("")) / 2 Printer.CurrentY = Printer.CurrentY + 1 Printer.Print "" '打印副标题 Printer.FontSize = 15 Printer.CurrentX = (usewidth - Printer.TextWidth(commonth & "月份经济情况报表")) / 2 Printer.CurrentY = Printer.CurrentY + 1 Printer.Print commonth & "月份经济情况报表" '打印空白行 Printer.FontSize = 8 Printer.CurrentX = (usewidth - Printer.TextWidth("")) / 2 Printer.CurrentY = Printer.CurrentY + 1 Printer.Print "" '打印表的内容 '首先打印第一条横线 '打印最上边的第一条横线 Printer.CurrentX = pageleft + Printer.ScaleLeft startline = Printer.CurrentY + 1 Printer.Line -((Printer.ScaleLeft + Printer.ScaleWidth - pageleft), Printer.CurrentY) Printer.FontSize = 12 Printer.CurrentY = Printer.CurrentY + 1 starty = Printer.CurrentY Printer.CurrentX = ((Printer.ScaleWidth - 40) / 3 - Printer.TextWidth("")) / 2 Printer.Print "" Printer.FontSize = 12 Printer.CurrentX = usewidth / 3 + ((usewidth / 3 - Printer.TextWidth("今年经济情况")) / 2) Printer.CurrentY = starty Printer.Print "今年经济情况(万元)" Printer.FontSize = 12 Printer.CurrentX = (usewidth / 3) * 2 + ((usewidth / 3 - Printer.TextWidth("去年经济情况")) / 2) Printer.CurrentY = starty Printer.Print "去年经济情况(万元)" Printer.CurrentX = pageleft + Printer.ScaleLeft Printer.CurrentY = Printer.CurrentY + 1 Printer.Line -((Printer.ScaleLeft + Printer.ScaleWidth - pageleft), Printer.CurrentY) Printer.CurrentY = Printer.CurrentY + 1 For i = 0 To 10 '判断是否该页已打满 Me.MSFlexGrid1.Row = i If Printer.CurrentY >= useheight Then '打印横线 Printer.CurrentX = Printer.ScaleLeft + pageleft Printer.Line -((Printer.ScaleLeft + Printer.ScaleWidth - pageleft), Printer.CurrentY) Printer.CurrentY = Printer.CurrentY + 1 '打印四条竖线 endline = Printer.CurrentY Printer.Line (0, startline)-(0, endline) Printer.Line (usewidth / 3, startline)-(usewidth / 3, endline) Printer.Line ((usewidth / 3) * 2, startline)-((usewidth / 3) * 2, endline) Printer.Line (usewidth, startline)-(usewidth, endline) '打印页号 Printer.CurrentX = (Printer.ScaleWidth - Printer.TextWidth(Printer.Page)) / 3 - pageleft Printer.CurrentY = useheight + 3 Printer.Print Printer.Page Printer.NewPage 'NewPage告诉打印机,程序对当前输出页的发送已经结束。Printer对象应开始新的一页。 Printer.CurrentX = pageleft + Printer.ScaleLeft Printer.CurrentY = pageheader + Printer.ScaleTop startline = Printer.CurrentY Else '打印一行数据 Me.MSFlexGrid1.Col = 0 Printer.CurrentX = ((Printer.ScaleWidth - 40) / 3 - Printer.TextWidth(Me.MSFlexGrid1.Text)) / 8 starty = Printer.CurrentY Printer.Print Me.MSFlexGrid1.Text Me.MSFlexGrid1.Col = 1 Printer.CurrentX = (Printer.ScaleWidth - 40) / 3 + ((Printer.ScaleWidth - 40) / 3 - Printer.TextWidth(Me.MSFlexGrid1.Text)) / 2 Printer.CurrentY = starty Printer.Print Me.MSFlexGrid1.Text Me.MSFlexGrid1.Col = 2 Printer.CurrentX = ((Printer.ScaleWidth - 40) / 3) * 2 + ((Printer.ScaleWidth - 40) / 3 - Printer.TextWidth(Me.MSFlexGrid1.Text)) / 2 Printer.CurrentY = starty Printer.Print Me.MSFlexGrid1.Text Printer.CurrentX = pageleft + Printer.ScaleLeft Printer.CurrentY = Printer.CurrentY + 1 Printer.Line -((Printer.ScaleLeft + Printer.ScaleWidth - pageleft), Printer.CurrentY) Printer.CurrentY = Printer.CurrentY + 1 End If Next i '打印最后一条横线 Printer.CurrentX = Printer.ScaleLeft + pageleft Printer.Line -((Printer.ScaleLeft + Printer.ScaleWidth - pageleft), Printer.CurrentY) endline = Printer.CurrentY '打印四条竖线 Printer.Line (0, startline)-(0, endline) Printer.Line (usewidth / 3, startline)-(usewidth / 3, endline) Printer.Line ((usewidth / 3) * 2, startline)-((usewidth / 3) * 2, endline) Printer.Line (usewidth, startline)-(usewidth, endline) '打印页号 Printer.CurrentX = (Printer.ScaleWidth - Printer.TextWidth(Printer.Page)) / 3 - pageleft Printer.CurrentY = useheight + 3 'Printer.Print Printer.Page Printer.Print " 哈尔滨高新技术开发区" Printer.EndDoc 'EndDoc告诉VISUAL BASIC,程序创建文档结束。VISUAL BASIC应将它发送到物理打印机上打印。 If Err.Number = 0 Then MsgBox "you are successful!", , "" End If End Sub
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值