C#打印功能的详细说明

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

打印操作通常包括以下四个功能

打印设置 设置打印机的一些参数比如更改打印机驱动程序

页面设置 设置页面大小纸张类型等

打印预览 类似于word中的打印预览

打印

PrintDocument

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

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

    2)设置类实例的属性

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

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

打印:printDt.Print();

PrintDocument类包括以下几个属性 事件 和方法:

  共有四个与C#打印和C#打印预览的实现有关的属性:

    ◆DefaultPageSettings:保存了打印文档的默认页面设置,如大小、打印方向,它是一个PageSettings类型的变量。

    ◆DocumentName:用于设置PrintDocument类实例的名字。是一个string类型的变量。

     PrinterSettings:包含了打印机的设置信息,可以通过“打印”通用对话框对其进行设置。

     DocumentName 属性:指定文档名称,出现在打印机状态窗口中

    在执行打印操作之前,应该对这4个属性进行正确的设置。 PageSettings类和PrinterSettings类 与PrintDocument类的属性设置相关的类。

    PageSettings类指定单个打印页面的设置。

    PrinterSettings类包含打印机的设置信息。 这两个类,用户可以对打印机和打印页面进行充分的控制。

    C#打印和C#打印预览的实现之处理打印事件PrintDocument类提供了4个事件用来处理打印操作。

    ◆BeginPrint事件

这个事件在调用Print方法之后,并且在打印第1个页面之前被触发。可以在这个事件中设置应用于所有页面的打印机属性和页面属性,以及使用的字体等参数。

    事件代理为PrintEventHandler,事件参数类型为PrintEvnetArgs。在PrintEvnetArgs中包含一个Cancel属性,可以通过这个属性设置为True来禁用打印操作。

1.        This.printDt.BeginPrint += new PrintEventHandler(this.BeginPrinting);

2.        Private void BeginPrinting(object sender, PrintEvnetArgs e)   

3.        {//针对开始打印事件进行相应的处理   

4.        }  

    ◆EndPrint事件

    这个事件在打印完最后一个页面时被触发。可以在这个事件中完成一些资源清理工作。事件代理为PrintEventHandler,事件参数类型为PrintEvnetArgs。

    ◆PrintPage事件

    这个事件在开始打印每一页时被触发,每页的打印都是在这个事件中完成的。用户必须为这个事件提供处理函数,以完成实际的打印操作。

事件代理类型为 PrintPageEvnetHandler,事件参数的类型为PrintPageEventArgs。

PrintPageEventArgs参数有很多重要的属性

  1 Cancel 取消打印

  2 Graphics 页面的绘图对象

  3 HasMorePages 是否还有要打印的页面

printDt.PrintPage +=new PrintPageEvnetHandler(this.PrintEveryPage);   

private void PrintEveryPage(object sender, PrintPageEventArgs)   

{   

Graphics gh = e.Graphics;//获取绘图对象   

//进行具体的绘画操作   

//如 gh.DrawingString(..);

..   

If (仍有页面未打印)   

e.HasMorePages = true;   

else  

e.HasMorePages = false;   

}  

    ◆QueryPageSettings事件

这个事件在每个PrintPage事件之前被触发,可以使用这个事件来设置打印每一个页面的页面设置。

事件代理类型为 QueryPageSettingsEventHandler,事件参数的类型为QueryPageSettingsEventArgs。事件参数中包含一个PageSettings属性。

printDt.QueryPageSettings += new QueryPageSettingsEventHandler(this.SetEveryPage);

private void SetEveryPage(object sneder, QueryPageSettingsEventArgs e)   

{  

//根据不同的页面来设置e.PageSettings属性  

…  

}   

Print 方法 该方法没有参数 调用它将按照当前设置开始打印

若实现打印功能首先构造PrintDocument对象添加打印事件

PrintDocument printDocument;

private void InitializeComponent()

{

...

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++;

    }

如果本页打印完成而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_PageSet_Click(object sender,EventArgs e)

{

  PageSetupDialog pageSetupDialog = new PageSetupDialog();

  pageSetupDialog.Document = printDocument;

  pageSetupDialog.ShowDialog();

}

也可以直接设置页面的属性

//设置边距   

Margins margin = new Margins(20, 20, 20, 20);   

printDocument.DefaultPageSettings.Margins = margin;   

//纸张设置默认  

PaperSize pageSize = new PaperSize("First custom size", 800, 600);  

printDocument.DefaultPageSettings.PaperSize = pageSize;  

 

打印预览

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());

            }

       }

  }

 

实现打印窗体的代码如下:

void printButton_Click(object sender, EventArgs e)  

 {  

 CaptureScreen();  

 printDocument1.Print();  

 }  

//实现C#打印窗体  

Bitmap memoryImage;   

private void CaptureScreen()  

 {  

 Graphics myGraphics = this.CreateGraphics();  

 Size s = this.Size;  

 memoryImage = new Bitmap(s.Width, s.Height, myGraphics);  

 Graphics memoryGraphics = Graphics.FromImage(memoryImage);  

 memoryGraphics.CopyFromScreen(  this.Location.X, this.Location.Y, 0, 0, s);  

 }   

private void printDocument1_PrintPage(Object sender, PrintPageEventArgs e)

 {  

 e.Graphics.DrawImage(memoryImage, 0, 0);  

 }   

展开阅读全文

没有更多推荐了,返回首页