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 设置和查看打印效
果这些方法通常是由菜单的单击触发的。
天街小雨润如酥,草色遥看近却无。醉卧沙场君莫笑,古来征战几人回!雪消门外千山绿,花发江边二月晴。信言不美,美言不

时间: 2024-10-16 13:04:29

c#打印的相关文章

c打印9*9乘法表

c打印9*9乘法表(这里提供了两种打印方法).乘号两边有规律可寻,其左边递减,右边递增. 1 #include <stdio.h> 2 int main() 3 { 4 int i, j, result; 5 for (i = 9; i >= 1; i--) //外层循环,从9开始,每次循环自减1 6 { 7 for (j = 1; j <= i; j++) //内层循环,从1开始,每次循环自加1 8 { 9 result = i*j; 10 printf("%d*%d=

按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: vector<vect

设计一个程序能够将某一个目录下面的所有文件名打印出来---File类的使用

,设计一个程序能够将某一个目录下面的所有文件名打印出来 运用到的方法有:返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录:list()           测试此抽象路径名表示的文件是否是一个目录:isDirectory()           返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件:listFiles() package printfilename; import java.io.File; public class PrintFileNam

linux提取指定列字符并打印所有内容(awk)

假设有文件长如下样子: CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  samplename 1 3552841 . G . 32.995 . DP=1;MQ0F=0;AF1=0;AC1=0;DP4=1,0,0,0;MQ=40;FQ=-29.9912 GT:PL:DP 0/0:0:1 1 3552842 . T . 32.995 . DP=1;MQ0F=0;AF1=0;AC1=0;DP4=1,0,0,0

完成打印购物小票并计算积分

import java.util.Scanner; /** * @author 蓝色以太 * 完成打印购物小票并计算积分 */ public class ShoppingReceipt { public static void main(String[] args) { Scanner sc=new Scanner(System.in); final int NUM1=245,NUM2=570,NUM3=320; System.out.println("请输入购买T恤数量:"); in

题目:打印出如下图案(菱形)

×× ×××××× ×××××××××× ×××××× ×× class HomeWork0604{public static void main (String[] args){int i,j,k;for(i=0;i<=3;i++) //控制前三行 { for(j=0;j<(2*(3-i));j++) //控制前三行空格System.out.print(" ");for(k=0;k<(4*i-2);k++) //控制前三行* System.out.print(&qu

java初学打印星星以及九九乘法表

Java中打印星星,就是为了让初学者熟悉和掌握循环的使用方法: 给定一个图形如: * *** ***** ******* 第一种方式:由循环输出各个部分,再结合起来 for(int i=1;i<=4;i++){< p=""> for(int j=1;j<=7-i;j++){< p=""> system.out.print(" "); } for(int j=1;j<=2*i-1;j++){< p=&

Citrix XenApp和XenDesktop 打印系统解析③

Citrix Universal PrintServer(UPS) 3.3.1.Citrix UPS概述 Citrix UniversalPrinter Server(以下简称UPS)是一个XenApp和XenDesktop环境中的一个打印组件,它有助力提高用户在网络打印方面的体验. 首先我们来说,Citrix已经有了UPD为什么还需要推出UPS?根据前文我们的描述,Citrix UPD只是解决了基于客户端的打印问题(当然并不是完全解决,部分驱动还存在兼容问题),而对于网络打印呢?Citrix

打印W图案

一:规律 二维图形的展示都可以使用二维数组来解决,W图形x轴0,1,2,1,0,1,2.....在0到2直接来回的徘徊 y轴是在一直递增........ 二:代码 1 @Test 2 /** 3 * 测试打印w图案 4 */ 5 public void testPrintW() { 6 int[][] arr = new int[3][9]; 7 // 初始化x,y 8 int x = 2; 9 int y = 0; 10 boolean flag = false; 11 for (int i

Linux C打印IP地址信息

1.由文件描述符打印IP地址及端口.(参考) #include <stdio.h> #include <netdb.h> #include <sys/socket.h> #include <arpa/inet.h> //由文件描述符打印对应IP地址和端口 void PrintAddrByFd(int sockfd) { struct sockaddr_in addr_in; socklen_t len = sizeof(addr_in); getsockna