当前位置:  编程技术>.net/c#/asp.net

C#实现打印与打印预览功能的思路及代码

    来源: 互联网  发布时间:2014-10-25

    本文导语:  在windows应用程序中文档的打印是一项非常重要的功能,在以前一直是一个非常复杂的工作,Microsoft .Net Framework的打印功能都以组件的方式提供,为程序员提供了很大的方便,但是这几个组件的使用还是很复杂的,有必要解释一...

在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对象添加打印事件

代码如下:

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

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

代码如下:

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

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

protected  void FileMenuItem_PrintSet_Click(object sender,EventArgs e)
{
    PrintDialog printDialog = new PrintDialog();
    printDialog.Document = printDocument;
    printDialog.ShowDialog();
}

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

代码如下:

protected  void FileMenuItem_PageSet_Click(object sender,EventArgs e)
{
    PageSetupDialog pageSetupDialog = new PageSetupDialog();
    pageSetupDialog.Document = printDocument;
    pageSetupDialog.ShowDialog();
}

打印预览

代码如下:

protected void FileMenuItem_PrintView_Click(object sender,EventArgs e)
{
   PrintPreviewDialog printPreviewDialog = new PrintPreviewDialog();
   printPreviewDialog.Document = printDocument;
   lineReader = new StringReader(textBox.Text);
   try
   {
        printPreviewDialog.ShowDialog();
   }
   catch(Exception excep)
   {
        MessageBox.Show(excep.Message, "打印出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
   }
}

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

代码如下:

 protected void FileMenuItem_Print_Click(object sender,EventArgs e)
  {
   PrintDialog printDialog = new PrintDialog();
   printDialog.Document = printDocument;
   lineReader = new StringReader(textBox.Text);
   if (printDialog.ShowDialog() == DialogResult.OK)
   {
       try
       {
         printDocument.Print();
       }
       catch(Exception excep)
       {
              MessageBox.Show(excep.Message, "打印出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
              printDocument.PrintController.OnEndPrint(printDocument,new PrintEventArgs());
       }
    }
  }

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

    
 
 

您可能感兴趣的文章:

  • c#通过委托delegate与Dictionary实现action选择器代码举例
  • C#实现获取枚举中元素个数的方法
  • C#实现自定义双击事件
  • C#键盘输入回车键实现点击按钮效果的方法
  • C#实现获取一年中是第几个星期的方法
  • C#实现Datatable排序的方法
  • C#实现装箱与拆箱操作简单实例
  • 解决C#中WebBrowser的DocumentCompleted事件不执行的实现方法
  • C#下实现创建和删除目录的实例代码
  • 使用C#实现在屏幕上画图效果的代码实例
  • C#实现过滤html标签并保留a标签的方法
  • c#实现TextBox只允许输入数字
  • C# Winform 整个窗口拖动的实现代码
  • c# ListView实现双击Item事件的变通方法
  • C#实现随鼠标移动窗体实例
  • C#中的FileUpload 选择后的预览效果具体实现
  • C# 窗体隐藏及任务管理器中禁止关闭的实现代码
  • C#的锯齿数组以及C++实现代码
  • C#格式化文件大小的实现代码
  • C#实现Datatable排序的方法 iis7站长之家
  • C# char类型字符转换大小写的实现代码
  • (急,改天请吃饭,谢)如何把jsp页面的打印按纽关联到IE的打印功能或如何用简单的实现打印页面
  • 用applet实现打印,除了弹出系统自带的打印对话框,在自其前后各弹出一个”小应用程序需打印,要继续吗?“的对话框,如何去掉这两个对话
  • 我要把在applet里用swing的jtable展现的数据表格,实现打印的功能且可由用户选择需打印的列,该怎么办?不知这种表格能否也象jsp或javascript那样转换成excel呢?
  • 如何编程实现SCO控制终端打印的字体大小或间距等?
  • 如何实现这种方式的打印?
  • 关于B/S结构的客户端打印的问题,求教各位 各位大虾,我用servlet和jsp作了一套b/s的系统,现在客户端需要打印,怎样才能实现?帮帮忙啊,小弟再此先谢过了!
  • 使用Applet能不能实现基于浏览器的打印呢???
  • 请教!如何用按钮实现jsp或html页面的打印功能?
  • 用JSP实现报表打印
  • Redhat9上Qt编程如何实现报表打印?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • jsp中点击图片弹出文件上传界面及预览功能的实现
  • jquery预览图片实现鼠标放上去显示实际大小
  • jQuery实现鼠标经过图片预览大图效果
  • jquery实现预览提交的表单代码分享
  • asp.net DataGridView打印预览的实现代码
  • 通过javascript实现DIV居中,兼容各浏览器版本
  • socket实现多文件并发传输,求助多线程实现问题?
  • Python GUI编程:tkinter实现一个窗口并居中代码
  • interface 到底有什么用???实现接口,怎么实现??
  • 通过javascript库JQuery实现页面跳转功能代码
  • 怎么用Jsp实现在页面实现树型结构?
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • windows 下的PortTunnel 在linux下怎么实现?或者相应的已经实现的软件?端口映射
  • php实现socket实现客户端和服务端数据通信源代码
  • 网站重定向用C语言实现iptables,ACL实现
  • flash AS3反射实现(describeType和getDefinitionByName)
  • 在linux下如何编程实现nslookup命令实现的IP地址和域名互相转换的功能?
  • boost unordered_map和std::list相结合的实现LRU算法
  • 求在freebsd+Squid下实现pc上网的透明代理的实现方法!给出具体配置方法的高分谢!
  • 使用java jdk中的LinkedHashMap实现简单的LRU算法
  • linux下如实现与window下的驱动器实现文件共享??
  • iphone cocos2d 精灵的动画效果(图片,纹理,帧)CCAnimation实现
  • qt如何实现:操作键盘实现数据的滚动?
  • c语言判断某一年是否为闰年的各种实现程序代码
  • 我想用APPLET实现读取客户端的图片文件,该如何实现?
  • html<pre>标签自动换行实现方法
  • PING是用TCP,还是用UDP来实现的?或是采用其它协议实现的?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3