c#打印(转)
柴门闻狗吠,风雪夜归人。野旷天低树,江清月近人。香雾云鬟湿,清辉玉臂寒。莫愁前路无知己,天下谁人不识君。常将冷眼 
看螃蟹,看你横行到几时。要在vs2005中实现最基本的打印文本基本上需要以下几个步骤
1 新建项目(窗体)
2 在窗体上添加printDocument 控件 添加 Button textBox 控件
在 printDocument 控间的 PrintPage 事件中添加代码
e.Graphics.DrawString(textBox1.Text,new Font("Arial", 20, FontStyle.Bold), Brushes.Black, 150, 125);
4 为 button 控件添加 Click 事件 在事件中添加以下代码
PrintDialog printDialog1 = new PrintDialog(); // 声明定义 打印对话框
printDialog1.Document = printDocument1;
DialogResult result = printDialog1.ShowDialog();
if (result == DialogResult.OK)
{
printDocument1.Print();
}
5 为printDocument 控件 添加 EndPrint 事件比如 在打印技术后 有一提示语
6 在msdn中有“页边距和纸张方向的设置要用到 PageSetupDialog 类“的说明 个人认为设置并不是很方便 由于前面已经 
创建了 printDilog的实例 printDilog1,因此可以通过改变对话框的某些默认设置来改变打印方
    式,例如:下面的例子设
定了默认打印方向为横向
printDialog1.Document.DefaultPageSettings.Landscape = true;
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=new PrintDocument();
printDocument.PrintPage += new PrintPageEventHandler (this.printDocument_PrintPage);
6 ...
}
实现打印事件功能打印和绘图类似都是调用Graphics 类的方法进行画图 不同的是一个在显示器上一个在打印纸上并且打印要进 
行一些复杂的计算
如换行 分页等。
private void printDocument_PrintPage(object sender,PrintPageEventArgs e)
{
Graphics g = e.Graphics; //获得绘图对象
float linesPerPage = ; //页面的行号
float yPosition = ; //绘制字符串的纵向位置
int count = ; //行计数器
float leftMargin = e.MarginBounds.Left; //左边距
float topMargin = e.MarginBounds.Top; //上边距
string line = null; //行字符串
Font printFont = this.textBox.Font; //当前的打印字体
11 SolidBrush myBrush = new SolidBrush(Color.Black);//刷子
linesPerPage = e.MarginBounds.Height / printFont.GetHeight(g);//每页可打印的行数 //逐行的循环打印一页
13 while(count < linesPerPage && ((line=lineReader.ReadLine()) != null))
{
yPosition = topMargin + (count * printFont.GetHeight(g));
g.DrawString(line, printFont, myBrush, leftMargin, yPosition, new StringFormat());
count++;
}
如果本页打印完成而line不为空说明还有没完成的页面这将触发下一次的打印事件在下一次的打印中lineReader会 自动读取上次 
没有打印完的内容因为lineReader是这个打印方法外的类的成员它可以记录当前读取的位置
if(line != null)
e.HasMorePages = true;
else
e.HasMorePages = false;
}
打印设置,构造打印对话框 将对话框中设置的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_PrintSet_Click(object sender,EventArgs e)
{
PrintDialog printDialog = new PrintDialog();
printDialog.Document = printDocument;
printDialog.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, "打印出错", essageBoxButtons.OK, MessageBoxIcon.Error);
printDocument.PrintController.OnEndPrint(printDocument,new PrintEventArgs()); }
}
}
总结打印的过程是
1 在应用程序窗体初始化时构造PrintDocument对象 添加 printDocument 的 PrintPage 方法
 
2 实现PrintPage方法
  4 在用户的单击事件中调用 printDocument 的 Print方法实现打印功能
在这中间可能要用到  PrintDialog
PrintPreviewDialog PageSetupDialog 设置和查看打印效
果这些方法通常是由菜单的单击触发的。
天街小雨润如酥,草色遥看近却无。醉卧沙场君莫笑,古来征战几人回!雪消门外千山绿,花发江边二月晴。信言不美,美言不
信
c#打印(转)的更多相关文章
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(55)-Web打印
		系列目录 前言 1.本次主要弥补工作流,用户表单数据的打印 2.使用JQprint做为web打印插件 3.兼容:FireFox,Chrome,IE. 4.没有依赖也没有配置,使用简单 代码下载:htt ... 
- C#中5步完成word文档打印的方法
		在日常工作中,我们可能常常需要打印各种文件资料,比如word文档.对于编程员,应用程序中文档的打印是一项非常重要的功能,也一直是一个非常复杂的工作.特别是提到Web打印,这的确会很棘手.一般如果要想选 ... 
- 开源免费且稳定实用的.NET PDF打印组件itextSharp(.NET组件介绍之八)
		在这个.NET组件的介绍系列中,受到了很多园友的支持,一些园友(如:数据之巅. [秦时明月]等等这些大神 )也给我提出了对应的建议,我正在努力去改正,有不足之处还望大家多多包涵.在传播一些简单的知识的 ... 
- Ajax使用WCF实现小票pos机打印源码
		通过ajax跨域方式调用WCF服务,实现小票pos机的打印,源码提供web方式,客户端方式测试,服务驻留右侧底部任务栏,可控制服务开启暂停,用户可自定义小票打印模板,配合零售录入. qq 22945 ... 
- Jqprint实现页面打印
		好些项目需要实现页面打印,特别是一些后台管理类系统,下面介绍一款轻量级的打印插件: 1.实现页面打印要引入jQuery和Jqprint.点击下载Jqprint插件 <script languag ... 
- Android连接网络打印机进行打印
		首先这是网络打印工具类,通过Socket实现,多说一句,网络打印机端口号一般默认的是9100 package com.Ieasy.Tool; import android.annotation.Sup ... 
- 打印Lua的Table对象
		小伙伴们再也不用为打印lua的Table对象而苦恼了, 本人曾也苦恼过,哈哈 不过今天刚完成了这个东西, 以前在网上搜过打印table的脚本,但是都感觉很不理想,于是,自己造轮子了~ 打印的效果,自己 ... 
- 解析大型.NET ERP系统 单据标准(新增,修改,删除,复制,打印)功能程序设计
		ERP系统的单据具备标准的功能,这里的单据可翻译为Bill,Document,Entry,具备相似的工具条操作界面.通过设计可复用的基类,子类只需要继承基类窗体即可完成单据功能的程序设计.先看标准的销 ... 
- jQuery:实现网页的打印功能
		实现的打印功能大致跟浏览器的 Ctrl+P 效果一样 一.直接上代码 <!DOCTYPE html> <head> <meta charset="utf-8&q ... 
- C# 设置Excel打印选项及打印excel文档
		C# 设置Excel打印选项及打印excel文档 打印Excel文档是一个很常见的操作,但有时候我们会碰到各种不同的打印需求,例如只打印一个Excel工作表的其中一部分,或打印时每页都有表头,或把工作 ... 
随机推荐
- hibernate4无法保存数据
			hibernate4无法保存数据 author: hiu 以后都发文章我都备注一下作者了,hiu就是我了 红色字体更新日期:2014-07-08 初次使用hibernate4,使用getCurrent ... 
- PHP中的密码加密的解决方案
			层出不穷的类似事件对用户会造成巨大的影响,因为人们往往习惯在不同网站使用相同的密码,一家“暴库”,全部遭殃 一般的解决方案 1.将明文密码做单向hash $password = md5($_POST[ ... 
- 通过配置CPU参数 worker_cpu_affinity 提升nginx性能
			简介 Nginx默认没有开启利用多核cpu,我们可以通过增加worker_cpu_affinity配置参数来充分利用多核cpu的性能.cpu是任务处理,计算最关键的资源,cpu核越多,性能就越好. 规 ... 
- HDUOJ----2487Ugly Windows
			Ugly Windows Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ... 
- HDUOJ---------2255奔小康赚大钱
			奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ... 
- deque容器的运用一点一点积累
			#include<iostream> #include<deque> #include<cstdio> #include<cstring> #inclu ... 
- 深入理解Java:自定义java注解
			要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5. ... 
- pthread到Win32thread
			一.什么是线程. 线程(thread)是为了提高系统内程序的并发(concurrency)执行程度而提出来的概念,它是比进程更小的能够独立运行的基本单位.在引入线程的系统中,线程是处理器调度(sche ... 
- 【ERROR】Oracle11g两个监听同名进程的故障
			问题: 一个实例启动了另个两个监听. 解决方法: #ps -ef | grep tnslsnr #oracle 925826 1 0 Apr 06 - 234:50 /u01/app/oracle/p ... 
- kubernetes 二
			部署harbor Habor是由VMWare中国团队开源的容器镜像仓库.事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而获 得了更加广泛的应用,这些新的企业级特性包括 ... 
