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 事件 在事件中添加以下代码

 1 PrintDialog printDialog1 = new PrintDialog(); // 声明定义 打印对话框
 3 printDialog1.Document = printDocument1;
 5 DialogResult result = printDialog1.ShowDialog();
 7 if (result == DialogResult.OK)
 8 { 
 9   printDocument1.Print();
10 }

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

1 PrintDocument printDocument;private void InitializeComponent()
2 {
3   ...
4   printDocument=new PrintDocument();
5   printDocument.PrintPage += new PrintPageEventHandler (this.printDocument_PrintPage);
6   ...
7 }

实现打印事件功能打印和绘图类似都是调用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   while(count < linesPerPage && ((line=lineReader.ReadLine()) != null))
14   {
15   yPosition = topMargin + (count * printFont.GetHeight(g));
16   g.DrawString(line, printFont, myBrush, leftMargin, yPosition, new StringFormat());
17   count++;
18   }

如果本页打印完成而line不为空说明还有没完成的页面这将触发下一次的打印事件在下一次的打印中lineReader会 自动读取上次
没有打印完的内容因为lineReader是这个打印方法外的类的成员它可以记录当前读取的位置

1 if(line != null)
2 e.HasMorePages = true;
3 else
4 e.HasMorePages = false;
5 }

打印设置,构造打印对话框 将对话框中设置的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_PrintSet_Click(object sender,EventArgs e)
2 {
3 PrintDialog printDialog = new PrintDialog();
4 printDialog.Document = printDocument;
5 printDialog.ShowDialog();
6 }

打印预览

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

打印就可以直接调用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#打印(转)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇location.search 详解Report List 报表开发下篇

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

随便看看

Kafka 权限管理实战(最全整理)

JAAS文件定义了链接KafkaBroker所需的用户名和密码,以及用于在代理的各个节点之间进行通信的用户名和口令:用户名/口令:用于代理之间通信的用户名与口令。...

R8500 MPv2 版本 刷梅林改版固件

R8500很复杂。此外,中国koolshare上有人发布了Merlin的修改和移植固件。主要原因是科学上网更方便,所以R8500被用作Merlin固件。这是我第一次使用Merlin固件。Koolshare的官方文件服务器:http://firmware.koolshare.cn/merlin_8wan_firmware/R8500/X7.4/官方固件刷到Me...

将txt、csv等文本文件导入Hive

将txt、csv等文本文件导入Hive目录将txt、csv等文本文件导入Hive00.数据在虚拟机外01.启动hadoop、hdfs02.将文件放置在hdfs目录下03.登录hive并进入指定数据库04.根据文件创建表05.执行导入语句00.数据在虚拟机外如果数据在虚拟机内,请跳过此步,直接执行接下来的操作。...

html,js简单保存textarea换行格式

有时我们需要在提交表单时保存html标记,但textarea不保存换行信息,因此我们需要使用js保存HTM标记,例如textarea的换行。˃˃g、 “”);这只是一个允许在js中保留HTML文本区域中的换行符和其他格式的模型。你需要开发它来满足你的需求。希望岑溪网站开发分享的内容对您有所帮助!...

nginx配置跨域(CORS)、防盗链(valid_referers)、缓存(expires)、压缩(gzip)

它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服AJAX只能同源使用的限制。服务器根据这个值,在许可范围内,则在头信息包含Access-Control-Allow-Origin。...

【Lua】使用随机数(转)

游戏中有一个用于创建角色的随机命名功能,它使用随机数。我在网上找到一篇关于在Lua使用随机数的文章。标记它。Lua需要两个函数来生成随机数:数学。randomseed,数学。数学随机种子接收整数n作为随机序列种子。将系统时间视为随机种子是很自然的,也就是说,数学随机——然后连续生成i=1,5do打印结束的随机数,但问题出现了。如果程序在短时间内运行几次,您得...