c#教程之打印和打印预览

4.1      打印和打印预览

打印和打印预览是一个编辑器必须具有的功能,本节介绍实现打印和打印预览的方法。一般要实现如下菜单项:打印、打印预览、页面设置。

4.8.1PrintDocument类

PrintDocument组件是用于完成打印的类,其常用属性、方法和事件如下:
l  属性DocumentName:字符串类型,记录打印文档时显示的文档名(例如,在打印状态对话框或打印机队列中显示)。
l  方法Print:开始文档的打印。
l  事件BeginPrint:在调用Print方法后,在打印文档的第一页之前发生。
l  事件PrintPage:需要打印新的一页时发生。
l  事件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提供了一些附加信息,主要有:
l e.Cancel:布尔变量,设置为true,将取消这次打印作业。
l e.Graphics:所使用的打印机的设备环境,参见第五章。
l e.HasMorePages:布尔变量。PrintPage事件处理函数打印一页后,仍有数据未打印,退出事件处理函数前设置HasMorePages=true,退出PrintPage事件处理函数后,将再次引发PrintPage事件,打印下一页。
l e.MarginBounds:打印区域的大小,是Rectangle结构,元素包括左上角坐标:Left和Top,宽和高:Width和Height。单位为1/100英寸。
l e.MarginBounds:打印纸的大小,是Rectangle结构。单位为1/100英寸。
l 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();//释放不用的资源
}

4.8.2打印设置对话框控件PageSetupDialog

Windows窗体的PageSetupDialog控件是一个页面设置对话框,用于在Windows应用程序中设置打印页面的详细信息,对话框的外观如图4.8.2。

图4.8.2
用户使用此对话框能够设置纸张大小(类型)、纸张来源、纵向与横向打印、上下左右的页边距等。在打开对话框前,首先设置其属性Document为指定的PrintDocument类对象,用来把页面设置保存到PrintDocument类对象中。为文本编辑器增加页面设置功能的具体步骤如下:
(7)    为文件顶级菜单项的弹出菜单增加菜单项:页面设置。
(8)    放PageSetupDialog控件到窗体,属性name为pageSetupDialog1。
(9)    为页面设置菜单项增加单击事件处理函数如下:
private void menuItem5_Click(object sender,System.EventArgs e)
{   pageSetupDialog1.Document=printDocument1;
pageSetupDialog1.ShowDialog();
}
(10)打开对话框pageSetupDialog1后,如果单击了确定按钮,PageSetupDialog对话框中所做的的页面设置被保存到PrintDocument类对象printDocument1中,如果单击了取消按钮,不保存这些修改,维持原来的值。当调用PrintDocument.Print方法来实际打印文档时,引发PrintPage事件,该事件处理函数的第二个参数e提供了这些设置信息。

4.8.3打印预览

PrintPreviewDialog类可以在屏幕上显示PrintDocument的打印效果,既打印预览。实现打印预览的具体步骤如下:
(11)为文件顶级菜单项的弹出菜单增加菜单项:打印预览。
(12)放PrintPreviewDialog控件到窗体,属性name为printPreviewDialog1。
(13)为打印预览菜单项增加单击事件处理函数如下:
private void menuItemPrintView_Click(object sender,System.EventArgs e)
{   printPreviewDialog1.Document=printDocument1;
printPreviewDialog1.ShowDialog();
}
(14)编译,运行,输入若干字符,试验一下预览的效果,预览的效果如图4.8.3。

图4.8.3

4.8.4用打印对话框PrintDialog实现打印

PrintDialog组件是类库中预先定义的对话框,用来设置对文档进行打印的打印机的参数,包括打印机名称、要打印的页(全部打印或指定页的范围)、打印的份数以及是否打印到文件等。在打开对话框前,首先设置其属性Document为指定的PrintDocument类对象,打开PrintDialog对话框后,修改的设置将保存到PrintDocument类的对象中。PrintDialog对话框的外观如图4.8.4。

图4.8.4
增加打印功能的具体步骤如下:
(15)放PrintDialog控件到窗体属性Name=printDialog1。
(16)为文件顶级菜单项的弹出菜单增加菜单项:打印。
(17)为打印菜单项增加单击事件处理函数如下:(不能打印?)
private void menuItemPrint_Click(object sender, System.EventArgs e)
{   printDialog1.Document=printDocument1;
    if(printDialog1.ShowDialog(this)==DialogResult.OK)
        printDocument1.Print();
}
(18)编译,运行,输入若干字符,试验一下打印效果。

时间: 2024-12-25 06:31:49

c#教程之打印和打印预览的相关文章

【FastReport教程】在报表的预览模式下复制或删除页面

下载FastReport.Net最新版本 在FastReport 2018.4中,出现了一个非常有趣的功能 - 在预览模式下复制和删除报表页面.也就是说,您可以选择特定的报表页面并根据需要多次克隆,或删除所选页面.在这种情况下,对模板本身没有影响.即使你只有一页,要使一切恢复到原始状态 - 只需再次构建报表. 例如,如果要打印报表以及多个实例中所需的任何特定页面.相反,不想打印的某些页面,在打印设置中,您可以选择所需的页码.但你必须记住这些数字.这不是很方便.使用新功能,您可以添加所需的页面.

css去掉打印网页时预览效果下的超链接

在我们写网页的时候,超链接是链接各个页面的桥梁,也是搜索引擎爬虫(spider)收录网站页面的关键,因此,在每个网页中会有许多的超链. 当我们根据需求要打印某个网页时,却发现在带有超链的文字的旁边显示出了超链,这显然不是我们想要的打印效果.今天,一个同行妹妹问我如何解决这个问题,我一时头大,从来没有遇到过这样的问题撒,该如何解决呢? 后来还是同行妹妹聪明,经过网上的一番查资料后,终于找到了解决问题的办法: a[href]:afer{} 哈哈...   写完收工.

Lodop打印设计矩形重合预览线条变粗

LODOP中的打印设计是辅助进行开发的,实际打印效果应以预览为准,很多效果都是在设计界面显示不出来,或设计和预览界面有差异.例如add_print_text文本的字间距.行间距,旋转,还有允许标点溢出和英文拆分样式:Lodop纯文本英文-等符号自动换行问题 还有一些超文本样式可能也会出现打印设计界面与预览界面有差异的情况.例如,某些调用的I引擎不同造成默认样式不同:Lodop中特殊符号¥打印设计和预览不同 Lodop除了可以用超文本的table表格,还可以用线条和矩形框制作表格,可以在打印设计里

怎么使用CAD编辑器打印预览CAD图纸?

怎么使用CAD编辑器打印预览CAD图纸?在日常的工作中,建筑设计师们编辑完图纸后,不仅仅需要对CAD图纸进行查看,有的时候如果要去建筑施工地去查看的话,不可能把电脑一起带到施工现场吧,那就需要变编辑好的CAD图纸打印出来,那怎么使用CAD编辑器打印预览CAD图纸?具体要怎么来进行操作了,下面就来教教大家具体操作方法,以下就是具体操作步骤. 步骤一:如果电脑中没有CAD转换器的话,就在浏览器的搜索框中搜索迅捷CAD编辑器,然后在搜索的结果中,点击官网进入,进入之后根据提示步骤来下载安装最新版本的C

基于Metronic的Bootstrap开发框架经验总结(9)--实现Web页面内容的打印预览和保存操作

在前面介绍了很多篇相关的<Bootstrap开发框架>的系列文章,这些内容基本上覆盖到了我这个Bootstrap框架的各个主要方面的内容,总体来说基本达到了一个稳定的状态,随着时间的推移可以会引入一些更好更新的内容进行完善,本篇继续这个系列,主要介绍如何实现Web页面内容的打印预览和保存操作. 1.Web页面打印的问题 在此之前,我一般使用比较好用的LODOP来执行打印的操作,这个在我之前有很多文章都有涉及,这个控件是一个ActiveX的控件,需要下载安装后就可以在页面是进行打印的排版设计,预

jqprint的网页打印,打印预览可以包含图片

自己负责的模块需要有个试卷打印的功能,需要将网页特定范围内的内容打印出来,所以选择了jquery.jqprint脚本 用起来也非常简单. //打印    $("#printPage").jqprint({        debug: false,//如果是true则可以显示iframe查看效果,默认是false         importCSS: true,//true表示引进原来的页面的css,默认是true.        printContainer: true,//表示如果原

C# 打印和打印预览

C#打印和C#打印预览的实现的三大部分:页面设置.打印预览.打印具体用到的类和属性事件都是什么内容呢?那么本文就向你介绍C#打印和C#打印预览的实现具体事宜. 我们谈到C#打印和C#打印预览的实现其中主要就是包括:页面设置.打印预览.打印三大部分.打印的原理是:生成mdi文件,系统碰到mdi的时候会自动以打印的方式处理.所以,不管用什么模板,什么方式:能在PrintPage事件处理中,生成一张要打印内容的图片就OK了!主要的支持类都包括在命名空间System.Drawing.Printing中,

1.关于QT中的Graphics绘图,定时器,动画,将窗口中的内容打印到图片上,打印机,打印预览

 1 新建项目 A  修改pro中的内容如下: HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += gui widgets printsupport B  编写MyWidget.h #ifndef MYWIDGET_H #define MYWIDGET_H   #include <QWidget> #include <QGraphicsScene> #include <QGraphicsLineItem>

关于IE打印预览内容显示不全的问题解决

目前在调整一个页面打印功能的时候,发现多行文本框TextArea在页面显示的时候,多行文本可以正常显示,但是在打印页面的时候,部分内容就被遮挡住了, 苦思冥想不得其解,后来还是请教了美工. 首先查了下TextArea的CSS样式,没有固定Height属性,但是IE开发者工具F12,跟踪样式里TextArea是有Height的,这个就是实际高度!(输入东西多Height就大,反之就小) 好像有点启发了!打印预览高度貌似和页面实际高度是一样的,但是打印预览页面的宽度没有表单页面宽,导致每行显示的字数