【GDI+编程--打印篇(二)】--轻松打印两则
来源:互联网 发布:网络女神思瑞被粉丝 编辑:程序博客网 时间:2024/06/08 05:09
引言
上篇博客对打印进行了解析,从解析中可以看出有关打印的控制分别被封存在两个命名空间下,这两个命名空间结合使用可以较好的控制打印。用一句话来总结上篇博客是:知其所以然,还要知其为何所以然。接下来将会讨论.NET有关打印实现的问题,很简单,但有些细节需要注意。
则一:打印文档
上篇博客也已经说到,在实现打印时首先要有打印文档,.NET把打印文档抽象成了一个类PrintDocument,该类在打印过程中必然会用到,它封装了打印的内容,可以在该对象中添加绘制图文。
在使用时通常创建 PrintDocument 类的实例,设置属性(例如 DocumentName 和 PrinterSettings),并调用 Print 方法来开始打印过程。 处理 PrintPage 事件指定打印输出的位置,使用 PrintPageEventArgs的 Graphics Graphics 属性。
a. 常用方法:Print()
b. 常用事件:BeginPrint在调用Print方法时并且在打印文档的第一页之前发生、EndPrint打印完文档的最后一页时发生、PrintPage当需要为当前页打印的输出时发生。
我们来看一个打印的实例,业务说明:在C:\My Documents\MyFile.txt文件内读取要打印的内容,在单击printButton按钮后创建新的PrintDocument对象,并为其制定PrintPage事件。
清单一:printButton按钮事件,读取数据流,创建打印文档,并为文档添加事件。使用加载文件对话框来选择需要打印的文档,这里限制的文档类型只能是txt。
''' <summary>''' 加载打印文件事件,加载txt文件''' </summary>''' <param name="sender"></param>''' <param name="e"></param>''' <remarks></remarks>Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickDim strFileName As StringDim strFileType As StringMe.OpenFileDialog1.ShowDialog()TextBox1.Text = OpenFileDialog1.FileNamestrFileName = OpenFileDialog1.SafeFileNamestrFileType = strFileName.ToString.Trim.Remove(0, strFileName.IndexOf(".") + 1)If strFileType <> "txt" Then MsgBox("请选择打印文件,文件类型必须为txt")End IfEnd Sub''' <summary>''' 打印按钮事件''' </summary>''' <param name="sender"></param>''' <param name="e"></param>''' <remarks></remarks>Private Sub printButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles printButton.ClickTry streamToPrint = New StreamReader("C:\My Documents\MyFile.txt") '读取要打印的数据流 TryprintFont = New Font("Arial", 10)Dim pd As New PrintDocument() '创建一个新的打印文档AddHandler pd.PrintPage, AddressOf Me.pd_PrintPage '为打印文档指定打印事件pd.Print() FinallystreamToPrint.Close() '关闭数据流 End TryCatch ex As Exception MessageBox.Show(ex.Message)End TryEnd Sub
清单二:PrintPage事件,当打印每一页时触发此事件,向文档中写入内容。
''' <summary>''' PrintPage事件,当每一页被打印时发生''' </summary>''' <param name="sender"></param>''' <param name="ev"></param>''' <remarks></remarks>Private Sub pd_PrintPage(ByVal sender As Object, ByVal ev As PrintPageEventArgs)Dim linesPerPage As Single = 0Dim yPos As Single = 0Dim count As Integer = 0Dim leftMargin As Single = ev.MarginBounds.LeftDim topMargin As Single = ev.MarginBounds.TopDim line As String = Nothing' Calculate the number of lines per page.linesPerPage = ev.MarginBounds.Height / printFont.GetHeight(ev.Graphics)' Print each line of the file.While count < linesPerPage line = streamToPrint.ReadLine() If line Is Nothing ThenExit While End If yPos = topMargin + count * printFont.GetHeight(ev.Graphics) ev.Graphics.DrawString(line, printFont, Brushes.Black, leftMargin, yPos, New StringFormat()) count += 1End While' If more lines exist, print another page.If (line IsNot Nothing) Then ev.HasMorePages = TrueElse ev.HasMorePages = FalseEnd IfEnd Sub
则二:打印设置对话框
通常我们所见的打印对话框有三种,分别是打印预览、页面设置、打印机设置。打印预览可以在打印前可视化的查看文档,但是一般情况下内容不可编辑,后两个对话框则控制着打印的过程,通过页面设置对话框来调整页面类型及打印的类型,最后通过打印对话框来选择打印机或者打印的页数等。
打印预览
''' <summary>''' 打印预览函数''' </summary>''' <param name="pb">需要预览的文档</param>''' <returns></returns>''' <remarks></remarks>Private Function PrintPreview(ByVal pb As PrintDocument) As BooleanDim printPre As PrintPreviewDialog '创建一个打印预览对话框printPre = New PrintPreviewDialogprintPre.Document = pb '为对话框指定打印文档printPre.ShowDialog() '显示打印预览Return TrueEnd Function
页面设置
这里我们看看下图的页面设置的两个属性,通过设置属性值的真假可以动态的指定内容是否可用。
''' <summary>''' 打印页面设置函数''' </summary>''' <param name="pb">要打印的文档</param>''' <returns></returns>''' <remarks></remarks>Private Function PrintPageSet(ByVal pb As PrintDocument) As BooleanDim PrintPage As PageSetupDialogPrintPage = New PageSetupDialogPrintPage.Document = pbPrintPage.ShowDialog()Return TrueEnd Function
打印对话框
PrintDialog类允许用户从已安装的打印机中选择一台打印机,选择打印份数和其它一些设置,如布局和打印纸张来源。
Note:基本常用的属性在下图中已经标明,打印弹出的对话框是Win XP样式显示的,想要应用显示必须设置UseEXDialog属性。
Note:UserEXDialog属性,在高版本的Win系统中该属性值为True时调用PrintDialog的Show方法时才会显示如下的打印窗体。
代码清单:打印对话框,当打印时指定文档属性,对于手写的PrintDialog对象需要设置UseEXDialog属性为True才可以进行打印。
''' <summary>''' 打印对话框''' </summary>''' <param name="pb">打印需要的文档</param>''' <returns></returns>''' <remarks></remarks>Private Function Print(ByVal pb As PrintDocument) As BooleanDim PrintDialog As PrintDialog '声明打印对话框PrintDialog = New PrintDialog '创建一个打印对话框PrintDialog.Document = pb '为打印对话框添加需要打印的文档PrintDialog.UseEXDialog = True '设置对话框的显示属性PrintDialog.ShowDialog() '显示对话框,如果打印对话框是动态创建的必须指定该属性才能显示窗体Return TrueEnd Function
结语
有关打印的文章写到这里已经结束,现在回头想想,从开始的打印解析中可以看出.NET打印封装了底层的API只提供给了用户直接操作的类,很好的符合了编程原则。然后,对打印的对话框进行了解析并用代码实现了打印的实例,很简单,但有一些细节需要注意,如UseEXDialog属性,在高版本的Win系统中需要设置为True才能显示PrintDialog窗体,最后总结一句话:思想上移,行动下移。
- 【GDI+编程--打印篇(二)】--轻松打印两则
- 【GDI+编程--打印篇(一)】--.NET打印机制解析
- 【GDI+编程--打印篇(三)】--分页打印
- VB编程步步高-打印篇(二)
- GDI+ 和打印
- 通过GDI打印
- windows下GDI 打印
- MFC GDI+ 打印
- 免费DataGridView打印及.NET轻松打印控件(VB打印,C#打印)
- 格式化打印(二)
- 轻松进行 Linux 打印
- C# GDI+编程(二)
- C# GDI+编程(二)
- 打印编程!
- 企业共享打印,打印内容轻松监控
- 轻松Java打印预览、Web打印
- DataGrid的打印(二)
- C#打印EXCEL(二)
- 使用命令导入、导出mysql大数据库
- 最完美解决Nginx部署ThinkPHP项目的办法
- YII使用PHPExcel导入Excel文件的方法
- [Leetcode] Unique Paths (Java)
- GDB在手调试全无忧
- 【GDI+编程--打印篇(二)】--轻松打印两则
- 线程分析方法
- IOS中NSUserDefaults的用法(轻量级本地数据存储)
- DICOM标准(2011)
- Effective stl 第1章 容器 第5条
- Today is boring... I register a new account in stackoverflow
- JavaScript模拟C输入
- 主流浏览器内核
- Objective-C语法之代码块(block)的使用