【转】C#中PrintDocument类详解

摘要:
PrintDocument组件是用于完成打印的类。它的常见属性、方法和事件如下:属性DocumentName:字符串类型,记录打印文档时显示的文档名称。要打印,首先为PrintDocument组件创建一个对象。在打开两个对话框之前,首先将对话框属性Document设置为指定的PrintDocument类对象,修改后的设置将保存在PrintDocument组件对象中。第三步是调用PrintDocument Print方法来实际打印文档。打印完成后,可以引发一个或多个PrintPage事件。EndPrint事件处理程序用于处理打印的后果。将PrintDocument控件放到表单中,属性名称为printDocument1。

PrintDocument组件是用于完成打印的类,其常用属性、方法和事件如下:

属性DocumentName:字符串类型,记录打印文档时显示的文档名(例如,在打印状态对话框或打印机队列中显示)。

方法Print:开始文档的打印。

事件BeginPrint:在调用Print方法后,在打印文档的第一页之前发生。

事件PrintPage:需要打印新的一页时发生。

事件EndPrint:在文档的最后一页打印后发生。

若要打印,首先创建PrintDocument组件的对象。然后使用页面设置对话框PageSetupDialog设置页面打印方式,这些设置作为要打印的所有页的默认设置。使用打印对话框PrintDialog设置对文档进行打印的打印机的参数。在打开两个对话框前,首先设置对话框的属性Document为指定的PrintDocument类对象,修改的设置将保存到PrintDocument组件对象中。第三步是调用PrintDocument.Print方法来实际打印文档。当调用该方法后,引发下列事件:BeginPrint、PrintPage、EndPrint。其中每打印一页都引发PrintPage事件,打印多页,要多次引发PrintPage事件。完成一次打印,可以引发一个或多个PrintPage事件。

程序员应为这3个事件编写事件处理函数。BeginPrint事件处理函数进行打印初始化,一般设置在打印时所有页的相同属性或共用的资源,例如所有页共同使用的字体、建立要打印的文件流等。PrintPage事件处理函数负责打印一页数据。EndPrint事件处理函数进行打印善后工作。这些处理函数的第2个参数System.Drawing.Printing.PrintEventArgs e提供了一些附加信息,主要有:

e.Cancel:布尔变量,设置为true,将取消这次打印作业。

e.Graphics:所使用的打印机的设备环境。

e.HasMorePages:布尔变量。PrintPage事件处理函数打印一页后,仍有数据未打印,退出事件处理函数前设置HasMorePages=true,退出PrintPage事件处理函数后,将再次引发PrintPage事件,打印下一页。

e.MarginBounds:打印区域的大小,是Rectangle结构,元素包括左上角坐标:Left和Top,宽和高:Width和Height。单位为1/100英寸。

e.MarginBounds:打印纸的大小,是Rectangle结构。单位为1/100英寸。

e.PageSettings:PageSettings类对象,包含用对话框PageSetupDialog设置的页面打印方式的全部信息。可用帮助查看PageSettings类的属性。

下边为这3个事件编写事件处理函数,具体步骤如下:

(1) 在最后一个using语句之后增加语句: using System.IO; using System.Drawing.Printing;

(2) 本例打印或预览RichTextBox中的内容,增加变量:StringReader streamToPrint=null。如果打印或预览文件,改为:StreamReader streamToPrint,流的概念参见第六章。增加打印使用的字体的变量:Font printFont。

(3) 放PrintDocument控件到窗体,属性name为printDocument1。

(4) 为printDocument1增加BeginPrint事件处理函数如下: private void printDocument1_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e) { printFont=richTextBox1.Font;//打印使用的字体 streamToPrint=new StringReader(richTextBox1.Text);//打印richTextBox1.Text }//如预览文件改为:streamToPrint=new StreamReader("文件的路径及文件名");

(5) printDocument1的PrintPage事件处理函数如下。streamToPrint.ReadLine()读入一段数据,可能打印多行。本事件处理函数将此段数据打印在一行上,因此方法必须改进。 private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { float linesPerPage=0;//记录每页最大行数  float yPos=0;//记录将要打印的一行数据在垂直方向的位置  int count=0;//记录每页已打印行数  float leftMargin=e.MarginBounds.Left;//左边距  float topMargin=e.MarginBounds.Top;//顶边距  string line=null;//从RichTextBox中读取一段字符将存到line中  //每页最大行数=一页纸打印区域的高度/一行字符的高度  linesPerPage=e.MarginBounds.Height/printFont.GetHeight(e.Graphics);  //如果当前页已打印行数小于每页最大行数而且读出数据不为null,继续打印  while(count<linesPerPage&&((line=streamToPrint.ReadLine())!=null))  { //yPos为要打印的当前行在垂直方向上的位置 yPos=topMargin+(count*printFont.GetHeight(e.Graphics));   e.Graphics.DrawString(line,printFont,Brushes.Black, leftMargin,yPos,new StringFormat());//打印,参见第五章   count++;//已打印行数加1  }  if(line!=null)//是否需要打印下一页   e.HasMorePages=true;//需要打印下一页  else   e.HasMorePages=false;//不需要打印下一页 }

(6) 为printDocument1增加EndPrint事件处理函数如下: private void printDocument1_EndPrint (object sender, System.Drawing.Printing.PrintEventArgs e) { if(streamToPrint!=null)   streamToPrint.Close();//释放不用的资源 }

免责声明:文章转载自《【转】C#中PrintDocument类详解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SqlSugarunicloud表增删改查下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

JS事件 文本框内容改变事件(onchange)通过改变文本框的内容来触发onchange事件,同时执行被调用的程序。

以下代码显示,当用户更改文本框中的文本时,会弹出一个对话框“您更改了文本内容!”。运行结果:该任务补充了右侧编辑器的第13行。当文本框的内容发生更改时,将调用message()函数,并弹出对话框“您更改了文本内容!”。DOCTYPEHTML˃文本框内容更改事件functionmessage(){alert(“您更改了文本内容!”);}个人简介:请编写您的个人...

Latex 双栏模式下表格太长怎么办?

有时一张桌子放不下任何一页。如果使用原始表包,它可能会溢出。因此,自动更改表格是很自然的。对于许多在线材料,建议使用Longtable。但是因为我的文章是双栏文章,所以这个包会有问题。例如,表格将只浮动在文本上,标题的显示也有问题。经过长时间的尝试,我终于找到了解决方案,而且非常简单。只需缩放表格。方法如下:egin{table*}[!...

C# Winform Treeview控件

WinformTreeview控件目录手动添加节点。丰富节点数据并清除所有节点信息。选择指定的节点。函数GetAllTreeNodeWinformTreeview控件手动添加节点//在根节点下添加根节点和子节点TreeNodeCollectionRoot=treeView1.Nodes;TreeNodecurNode=根。添加(“良好”);curN(电流)...

Uni-app v-on监听事件

使用标记上的v-on监视事件。缩写为@click common click events方法:方法:{Focus(){console.log;},blur(){console.log;},confirm(){console.log;},click(){console.log;},tap(){console.log;},longpress(){console....

allure报告实现保存失败用例截图功能

allure中可以保存日志信息和截图日志allure能够自动识别。截图需要自己在添加allure方法。...

Crontab详细用法-定时任务详解

LWC“八个字符,有效范围为0-31个月的整数:可以出现”,-*/“四个字符,无效范围为1-12或JAN DECDayofWeek:可以出现”。-*/?因为月日和周日将相互影响。例如,在“分钟”字段中使用5,20表示它将在每分钟的5和20分钟触发一次。50:表示它只能出现在周日和月日域中。如果在DayofWeek域中使用5L,这意味着它将在最后一个星期四触发...