C# 打印和打印预览

C#打印和C#打印预览的实现的三大部分:页面设置、打印预览、打印具体用到的类和属性事件都是什么内容呢?那么本文就向你介绍C#打印和C#打印预览的实现具体事宜。

我们谈到C#打印和C#打印预览的实现其中主要就是包括:页面设置、打印预览、打印三大部分。打印的原理是:生成mdi文件,系统碰到mdi的时候会自动以打印的方式处理。所以,不管用什么模板,什么方式;能在PrintPage事件处理中,生成一张要打印内容的图片就OK了!主要的支持类都包括在命名空间System.Drawing.Printing中,在程序集System.Drawing.dll中实现。C#打印和C#打印预览的实现主要通过PrintDocument类来完成,另外还包括几个辅助类:PrintDialog(打印对话框)、PrintPreviewDialog(打印预览对话框)、PageSetupDialog。

PrintDocument类是实现打印和打印预览的中心类,实际的打印操作是通过这个类来完成的。 使用这个类进行打印的操作过程:

1)创建类实例 PrintDocument printDt = new PrintDocument();

2)设置类实例的属性

3)为该类的打印事件添加事件处理函数

4)调用该类的Print函数进行打印。

打印:printDt.Print();

在windows应用程序中文档的打印是一项非常重要的功能,在以前一直是一个非常复杂的工作,Microsoft .Net Framework的打印功能都以组件的方式提供,为程序员提供了很大的方便,但是这几个组件的使用还是很复杂的,有必要解释一下。 
打印操作通常包括以下四个功能: 
1 打印设置 设置打印机的一些参数,比如更改打印机驱动程序等; 
2 页面设置 设置页面大小纸张类型等 
3 打印预览 类似于word中的打印预览 
4 打印

实现打印功能的核心是PrintDocument类这个类属于System.Drawing.Printing名字空间这个类封装了当前的打印设置页面设置以及所有的与打印有关的事件和方法 
这个类包括以下几个属性,事件和方法 
1、PrinterSettings 属性 
  存放打印机的设置信息,这个属性不需要程序员设置,因为它是由打印对话框获取的. 
2、PrintCountroller 属性 
  控制打印过程 
3、DefaultPageSettings 属性 
  存放页面设置信息,打印纸大小方向等,也不需要程序员设置,因为它是由页面设置对话框获取的. 
4、DocumentName 属性 
  指定文档名称,出现在打印机状态窗口中

1。 BeginPrint事件 
  在打印之前发出 
2. PrintPage事件 
  每打印一页是发出,事件接受一个PrintPageEventArgs参数该参数封装了打印相关的信息

PrintPageEventArgs参数有很多重要的属性 
  1 Cancel 取消打印 
  2 Graphics 页面的绘图对象 
  3 HasMorePages 是否还有要打印的页面

Print方法:该方法没有参数 调用它将按照当前设置开始打印. 
若实现打印功能首先构造PrintDocument对象添加打印事件

   1: PrintDocument printDocument;
   2: private void InitializeComponent()
   3: {
   4:     ...
   5:  // 这里的printDocument对象可以通过将PrintDocument控件拖放到窗体上来实现,注意要设置该控件的PrintPage事件。
   6:     printDocument=new PrintDocument();
   7:     printDocument.PrintPage += new PrintPageEventHandler (this.printDocument_PrintPage);
   8: ...
   9: }

实现打印事件功能 
打印和绘图类似都是调用Graphics 类的方法进行画图 不同的是一个在显示器上一个在打印纸上并且打印要进行一些复杂的计算 
如换行、分页等。

   1: private void printDocument_PrintPage(object sender,PrintPageEventArgs e)
   2: {
   3:     Graphics g = e.Graphics; //获得绘图对象
   4:     float linesPerPage = 0; //页面的行号
   5:     float yPosition = 0;   //绘制字符串的纵向位置
   6:     int count = 0; //行计数器
   7:     float leftMargin = e.MarginBounds.Left; //左边距
   8:     float topMargin = e.MarginBounds.Top; //上边距
   9:     string line = null; 行字符串
  10:     Font printFont = this.textBox.Font; //当前的打印字体
  11:     SolidBrush myBrush = new SolidBrush(Color.Black);//刷子
  12:     linesPerPage = e.MarginBounds.Height / printFont.GetHeight(g);//每页可打印的行数
  13:  //逐行的循环打印一页
  14:     while(count < linesPerPage && ((line=lineReader.ReadLine()) != null))
  15:     {
  16:        yPosition = topMargin + (count * printFont.GetHeight(g));
  17:        g.DrawString(line, printFont, myBrush, leftMargin, yPosition, new StringFormat());
  18:        count++;
  19:     }
  20:  // 注意:使用本段代码前,要在该窗体的类中定义lineReader对象:
  21:  //       StringReader lineReader = null;
  22:     //如果本页打印完成而line不为空,说明还有没完成的页面,这将触发下一次的打印事件。在下一次的打印中lineReader会
  23:     //自动读取上次没有打印完的内容,因为lineReader是这个打印方法外的类的成员,它可以记录当前读取的位置
  24:     if(line != null)
  25:         e.HasMorePages = true;
  26:     else
  27:  {
  28:         e.HasMorePages = false;
  29:   // 重新初始化lineReader对象,不然使用打印预览中的打印按钮打印出来是空白页
  30:   lineReader = new StringReader(textBox.Text); // textBox是你要打印的文本框的内容
  31:  }
  32: }

打印设置,构造打印对话框 将对话框中设置的Document属性赋给printDocument这样会将用户的设置自动保存到printDocument 
的PrinterSettings属性中

   1: protected  void FileMenuItem_PrintSet_Click(object sender,EventArgs e)
   2: {
   3:     PrintDialog printDialog = new PrintDialog();
   4:     printDialog.Document = printDocument;
   5:     printDialog.ShowDialog();
   6: }

页面设置和打印预览与打印设置原理相同都是构造对话框将用户在对话框中的设置保存到相应的类的属性中

   1: protected  void FileMenuItem_PageSet_Click(object sender,EventArgs e)
   2: {
   3:     PageSetupDialog pageSetupDialog = new PageSetupDialog();
   4:     pageSetupDialog.Document = printDocument;
   5:     pageSetupDialog.ShowDialog();
   6: }

打印预览

   1: protected void FileMenuItem_PrintView_Click(object sender,EventArgs e)
   2: {
   3:    PrintPreviewDialog printPreviewDialog = new PrintPreviewDialog();
   4:    printPreviewDialog.Document = printDocument;
   5:    lineReader = new StringReader(textBox.Text);
   6:    try
   7:    {
   8:         printPreviewDialog.ShowDialog();
   9:    }
  10:    catch(Exception excep)
  11:    {
  12:         MessageBox.Show(excep.Message, "打印出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
  13:    }
  14: }

打印就可以直接调用printDocument的Print()方法因为用户可能在打印之前还要再更改打印设置所以 
在这里再次显示打印设置对话框

   1: protected void FileMenuItem_Print_Click(object sender,EventArgs e)
   2:  {
   3:   PrintDialog printDialog = new PrintDialog();
   4:   printDialog.Document = printDocument;
   5:   lineReader = new StringReader(textBox.Text);
   6:   if (printDialog.ShowDialog() == DialogResult.OK)
   7:   {
   8:       try
   9:       {
  10:         printDocument.Print();
  11:       }
  12:       catch(Exception excep)
  13:       {
  14:              MessageBox.Show(excep.Message, "打印出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
  15:              printDocument.PrintController.OnEndPrint(printDocument,new PrintEventArgs());
  16:       }
  17:    }
  18:  }

总结打印的过程是 
1 在应用程序窗体初始化时构造PrintDocument对象,添加 printDocument 的 PrintPage 方法 
2 实现PrintPage方法 
3 在用户的单击事件中调用 printDocument 的 Print方法实现打印功能 
在这中间可能要用到  PrintDialog PrintPreviewDialog PageSetupDialog 设置和查看打印效果这些方法通常是由菜单的单击触发的。

本文来自: 中科软件园(www.4oa.com) 详细出处参考:http://www.4oa.com/Article/html/6/34/501/2005/18114.html 
作者做了部分修改和注释。

时间: 2024-11-02 00:59:08

C# 打印和打印预览的相关文章

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

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

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

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

基于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,//表示如果原

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就大,反之就小) 好像有点启发了!打印预览高度貌似和页面实际高度是一样的,但是打印预览页面的宽度没有表单页面宽,导致每行显示的字数

Devpexpress 打印预览问题

devexpress 12 之前报表打印: XtraReports rp1 = new XtraReports(); rp1.ShowPreview(): 即可预览报表: devexpress 13 之后报表打印预览 XtraReports rp1 = new XtraReports(); ReportPrintTool tool = new ReportPrintTool(rp1); tool.ShowPreview(): 以前直接的可调用方法,也只能先新增ReportPrintTool,再调

winfrom 打印和预览

在windows应用程序中文档的打印是一项非常重要的功能,在以前一直是一个非常复杂的工作,Microsoft .Net Framework的打印功能都以组件的方式提供,为程序员提供了很大的方便.由于工作中常用到印功功能,个人写了一个专门打印DataGridView对象一个类,可以实现预览和打印功能,而且自动缩放字段.添加颜色:在预览时可以根据不同的比例查看效果,可以查看第几页数据和直接打印第几页的 数据.请看效果图. 二.附上调用代码 三.提供源码: 1 using System; 2 usin

支持打印和打印预览Word文档处理控件TX Text Control ActiveX

TX Text Control ActiveX 控件为软件开发人员提供了强大的所见所得的Word文档处理,可以加载.编辑和保存Wod格式(DOCX.DOC.RTF等),生成Word报表,文档转换,导出和直接创建PDF和PDF/A文件.该产品分发完全免费,包含了标准版.专业版和企业版. 具体功能: 支持打印和打印预览 文档可以分割为多个不同的段落,每个段落都可以单独的格式化 支持定义超链接,并加载和保存HTML文件 支持添加项目符号和数字列表 支持多层Undo和Redo操作 支持插入任何数量的列到