• 在C#中实现打印功能(C#中PrintDialog,PrintDocument的使用) (转)


    C#中实现打印功能(C#PrintDialog,PrintDocument的使用)

     C#中使用PrintDialog可以很方便的实现程序的打印功能。

    其步骤如下:

    1. 创建一个PrintDialog的实例。如下:
      System.
      Windows.Forms.PrintDialog PrintDialog1=new PrintDialog ();
    2. 创建一个PrintDocument的实例.如下:
      System.Drawing.Printing.PrintDocument docToPrint =
         new System.Drawing.Printing.PrintDocument();
    3. 设置打印机开始打印的事件处理函数.函数原形如下
      void docToPrint_PrintPage(object sender,
         System.Drawing.Printing.PrintPageEventArgs e)
    4. 将事件处理函数添加到PrintDocumentPrintPage事件中
      docToPrint.PrintPage+=new PrintPageEventHandler(docToPrint_PrintPage);
    5. 设置PrintDocument的相关属性,如:
      PrintDialog1.AllowSomePages = true;PrintDialog1.ShowHelp = true;
    6. PrintDialogDocument属性设为上面配置好的PrintDocument的实例
      PrintDialog1.Document = docToPrint;
    7. 调用PrintDialogShowDialog函数显示打印对话框
      DialogResult result = PrintDialog1.ShowDialog();
    8. 根据用户的选择,开始打印
      if (result==DialogResult.OK)
         {
          docToPrint.Print();
         }

    例子如下:

    使用时先创建PrintService类的实例,然后调用void StartPrint(Stream streamToPrint,string streamType)函数开始打印。其中streamToPrint是要打印的内容(字节流),streamType是流的类型(txt表示普通文本,image表示图像);

    using System;
    using System.Drawing.Printing;
    using System.
    Windows.Forms;
    using System.IO;

    namespace EDImageSystem
    {
     /// <summary>
     /// PrintService
    的摘要说明。
     /// </summary>
     public class PrintService
     {
      public PrintService()
      {
       //
       // TODO:
    在此处添加构造函数逻辑
       //
       this.docToPrint.PrintPage+=new PrintPageEventHandler(docToPrint_PrintPage);
      }//
    将事件处理函数添加到PrintDocumentPrintPage

      // Declare the PrintDocument object.
      private System.Drawing.Printing.PrintDocument docToPrint =
       new System.Drawing.Printing.PrintDocument();//
    创建一个PrintDocument的实例

      private System.IO.Stream streamToPrint;
      string streamType;

      // This method will set properties on the PrintDialog object and
      // then display the dialog.
      public void StartPrint(Stream streamToPrint,string streamType)
      {

       this.streamToPrint=streamToPrint;
       this.streamType=streamType;
       // Allow the user to choose the page range he or she would
       // like to print.
       System.
    Windows.Forms.PrintDialog PrintDialog1=new PrintDialog ();//创建一个PrintDialog的实例。
       PrintDialog1.AllowSomePages = true;

       // Show the help button.
       PrintDialog1.ShowHelp = true;

       // Set the Document property to the PrintDocument for
       // which the PrintPage Event has been handled. To display the
       // dialog, either this property or the PrinterSettings property
       // must be set
       PrintDialog1.Document = docToPrint;//
    PrintDialogDocument属性设为上面配置好的PrintDocument的实例

       DialogResult result = PrintDialog1.ShowDialog();//调用PrintDialogShowDialog函数显示打印对话框

       // If the result is OK then print the document.
       if (result==DialogResult.OK)
       {
        docToPrint.Print();//
    开始打印
       }

      }

    // The PrintDialog will print the document
      // by handling the document's PrintPage event.
      private void docToPrint_PrintPage(object sender,
       System.Drawing.Printing.PrintPageEventArgs e)//
    设置打印机开始打印的事件处理函数
      {

       // Insert code to render the page here.
       // This code will be called when the control is drawn.

       // The following code will render a simple
       // message on the printed document
       switch(this.streamType)
       {
        case "txt":
         string text = null;
         System.Drawing.Font printFont = new System.Drawing.Font
          ("Arial", 35, System.Drawing.FontStyle.Regular);

         // Draw the content.
         System.IO.StreamReader streamReader=new StreamReader(this.streamToPrint);
         text=streamReader.ReadToEnd();
         e.Graphics.DrawString(text,printFont,System.Drawing.Brushes.Black,e.MarginBounds.X,e.MarginBounds.Y);
         break;
        case "image":
         System.Drawing.Image image=System.Drawing.Image.FromStream(this.streamToPrint);
         int x=e.MarginBounds.X;
         int y=e.MarginBounds.Y;
         int width=image.Width;
         int height=image.Height;
         if((width/e.MarginBounds.Width)>(height/e.MarginBounds.Height))
         {
          width=e.MarginBounds.Width;
          height=image.Height*e.MarginBounds.Width/image.Width;
         }
         else
         {
          height=e.MarginBounds.Height;
          width=image.Width*e.MarginBounds.Height/image.Height;
         }
         System.Drawing.Rectangle destRect=new System.Drawing.Rectangle(x,y,width,height);
         e.Graphics.DrawImage(image,destRect,0,0,image.Width,image.Height,System.Drawing.GraphicsUnit.Pixel);
         break;
        default:
         break;
       }
       
      }

     }
    }

  • 相关阅读:
    第二篇:服务消费者Feign
    第一篇:服务的注册与发现Eureka(Finchley版本)
    记一次包扫描的犯错
    0.简单工厂-simplefactory(非23之一)
    设计模式基础
    设计模式--六大设计原则
    Java中的包
    Java内部类
    Java多线程
    Java同步
  • 原文地址:https://www.cnblogs.com/sunbin/p/1749663.html
Copyright © 2020-2023  润新知