打印类

来源:互联网 发布:php开源论坛系统 编辑:程序博客网 时间:2024/05/16 05:07

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

namespace KeYun
{
 /// <summary>
 /// PrintGridDocument 的摘要说明。
 /// </summary>
 public class PrintGridDocument:PrintDocument
 {

  private DataGrid m_oDataGrid;//要打印的DataGrid
  private int m_nCurrPage;//当前页
  private int m_nCurrRow;//当前行
  private int m_nColumns;//列数
  private int m_nRows;//总行数
  private bool m_bInitialized=false;//是否初始化
  private int m_nLinesPerPage;//每页的行数
  public int m_nTotalPage;//总页数
  private float[] m_nColBounds;//列宽的集合
  
  private int x=0;
  public Font PrintFont;//打印字体
  public string Title;//标题
  DataTable dt;
  private float beishu=1.0f;

  public PrintGridDocument()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }
  private float GetWidth()
  {
   float j=0;
   for(int i=0;i<m_nColBounds.Length;i++)
   {
    j+=m_nColBounds[i];
   }
   return j;
   
  }
  public PrintGridDocument(DataGrid aGrid):base()
  {
   
   m_oDataGrid=aGrid;
   dt=((DataView)(m_oDataGrid.DataSource)).Table;
   m_nCurrPage=0;
   m_nCurrRow=0;
   m_nColumns=dt.Columns.Count;
   m_nRows=dt.Rows.Count;
  }

  protected override void OnBeginPrint(PrintEventArgs e)
  {
   base.OnBeginPrint (e);
   if(PrintFont==null)
    PrintFont=new Font("Arial",12);
   

  }
  protected override void OnPrintPage(PrintPageEventArgs e)
  {
   base.OnPrintPage (e);
   
   int nTextPosX=x;
   int nTextPosY=e.MarginBounds.Top;
   //int nTextPosY=GetRealMarginBounds(e).Top;
   if(!m_bInitialized)
   {
    
    m_nColBounds=new float[m_nColumns];
    for (int nCol=0;nCol<m_nColumns;nCol++)
    {
     m_nColBounds[nCol]=e.Graphics.MeasureString(
      dt.Columns[nCol].ColumnName,PrintFont).Width;
     for(int nRow=m_nCurrRow;nRow<m_nRows;nRow++)
     {
      if(e.Graphics.MeasureString(m_oDataGrid[nRow,nCol].ToString(),PrintFont).Width>
       m_nColBounds[nCol])
      {
       
       m_nColBounds[nCol]=e.Graphics.MeasureString(m_oDataGrid[nRow,nCol].ToString(),PrintFont).Width+PrintFont.Size;
      }

      
     }
     if(m_nColBounds[nCol]<Math.Ceiling(e.Graphics.MeasureString(
      dt.Columns[nCol].ColumnName,PrintFont).Width))
     {
      m_nColBounds[nCol]=(float)Math.Ceiling(e.Graphics.MeasureString(
       dt.Columns[nCol].ColumnName,PrintFont).Width);
     }
     

     //     if(m_nColBounds[nCol]>e.MarginBounds.Width/m_nColumns)
     //      m_nColBounds[nCol]=e.MarginBounds.Width/m_nColumns;
     
     if(dt.Columns[nCol].ColumnName=="客运站名称")
     {
      beishu=m_nColBounds[nCol]/(PrintFont.Size*10);
      m_nColBounds[nCol]=PrintFont.Size*10;
     }
     

    }

    
    

    if (GetWidth()>(!this.DefaultPageSettings.Landscape?this.DefaultPageSettings.PaperSize.Width:this.DefaultPageSettings.PaperSize.Height))
    {
     float j=GetWidth();
     float i=new float();
     if (!this.DefaultPageSettings.Landscape) 
      i=this.DefaultPageSettings.PaperSize.Width;
     else
      i=this.DefaultPageSettings.PaperSize.Height;
     PrintFont=new Font("Arial",(PrintFont.Size*i/j));
     
     for (int nCol=0;nCol<m_nColumns;nCol++)
     {
      m_nColBounds[nCol]=e.Graphics.MeasureString(
       dt.Columns[nCol].ColumnName,PrintFont).Width;
      for(int nRow=m_nCurrRow;nRow<m_nRows;nRow++)
      {
       if(e.Graphics.MeasureString(m_oDataGrid[nRow,nCol].ToString(),PrintFont).Width>
        m_nColBounds[nCol])
       {
       
        m_nColBounds[nCol]=(e.Graphics.MeasureString(m_oDataGrid[nRow,nCol].ToString(),PrintFont).Width+(PrintFont.Size));
       }

      
      }
      if(m_nColBounds[nCol]<Math.Ceiling(e.Graphics.MeasureString(
       dt.Columns[nCol].ColumnName,PrintFont).Width))
      {
       m_nColBounds[nCol]=(float)Math.Ceiling(e.Graphics.MeasureString(
        dt.Columns[nCol].ColumnName,PrintFont).Width);
      }
     

      //     if(m_nColBounds[nCol]>e.MarginBounds.Width/m_nColumns)
      //      m_nColBounds[nCol]=e.MarginBounds.Width/m_nColumns;
     
      if(dt.Columns[nCol].ColumnName=="客运站名称")
      {
       beishu=m_nColBounds[nCol]/(PrintFont.Size*10);
       m_nColBounds[nCol]=PrintFont.Size*10;
      }
     }

    }

    
    m_nLinesPerPage=(int)((e.MarginBounds.Height/PrintFont.GetHeight(e.Graphics))/beishu);
    m_nTotalPage=(int)Math.Ceiling((float)m_nRows/(float)m_nLinesPerPage);


    if (!this.DefaultPageSettings.Landscape)
    {
     if (GetWidth()<this.DefaultPageSettings.PaperSize.Width)
      x=(int)Math.Abs(GetWidth()-this.DefaultPageSettings.PaperSize.Width)/2;
     else
      x=0;
    }
    else
    {
     if (GetWidth()<this.DefaultPageSettings.PaperSize.Height)
      x=(int)Math.Abs(GetWidth()-this.DefaultPageSettings.PaperSize.Height)/2;
     else
      x=0;
    }
    nTextPosX=x;
    
    
   }
          
   m_bInitialized=true;

   m_nCurrPage++;

   if(this.PrinterSettings.PrintRange==PrintRange.SomePages)
   {
    
    while(m_nCurrPage<this.PrinterSettings.FromPage)
    {
     m_nCurrRow+=m_nLinesPerPage;
     m_nCurrPage++;
     if(m_nCurrRow>m_nRows)
      return;
    }
    if(m_nCurrPage>this.PrinterSettings.ToPage)
    {
     return;
    }

     
   }


   ///打印标题
   if(m_nCurrPage==1)
   {
    Font TitleFont=new Font("Arial",15,System.Drawing.FontStyle.Bold);
    //Font TitleFont=new Font("Arial",9);
    
    int nXpos=(int)(((e.PageBounds.Right-e.PageBounds.Left)/2)-
     e.Graphics.MeasureString(Title,TitleFont).Width/2);
    int nYpos=e.MarginBounds.Top-(int)TitleFont.GetHeight(e.Graphics)-(int)PrintFont.GetHeight(e.Graphics);
    //int nYpos=GetRealMarginBounds(e).Top-(int)TitleFont.GetHeight(e.Graphics)-(int)PrintFont.GetHeight(e.Graphics);
    Rectangle aRect2=new Rectangle();
    aRect2.X=nXpos;
    aRect2.Y=nYpos;
    aRect2.Width=(int)e.Graphics.MeasureString(Title,TitleFont).Width+(int)TitleFont.Size;
    aRect2.Height=(int)TitleFont.GetHeight(e.Graphics);
    e.Graphics.DrawRectangle(new Pen(Color.White,(float)0.1),aRect2);
    e.Graphics.DrawString(Title,TitleFont,Brushes.Black,aRect2);
    //e.Graphics.DrawString(Title,TitleFont,Brushes.Black,nXpos,
    // e.MarginBounds.Top-TitleFont.GetHeight(e.Graphics));
    
   }
   
   string strOut="第"+m_nCurrPage+"页,共"+m_nTotalPage+"页";
   e.Graphics.DrawString(strOut,PrintFont,Brushes.Black,e.MarginBounds.Right-e.Graphics.MeasureString
    (strOut,PrintFont).Width,e.MarginBounds.Bottom);


   
   Rectangle aRect=new Rectangle();
   ///打印列名标题
   //if(m_nCurrPage==1)
   //{
   for(int nCol=0;nCol<m_nColumns;nCol++)
   {
    
    aRect.X=nTextPosX;
    aRect.Y=e.MarginBounds.Top-(int)PrintFont.GetHeight(e.Graphics);
    //aRect.Y=GetRealMarginBounds(e).Top-(int)PrintFont.GetHeight(e.Graphics);
    aRect.Width=(int)m_nColBounds[nCol];
    aRect.Height=(int)PrintFont.GetHeight(e.Graphics);
    //e.Graphics.FillRectangle(Brushes.White,aRect);
    e.Graphics.DrawRectangle(new Pen(Color.Black,(float)0.1),aRect);
    //e.Graphics.DrawString(
    // dt.Columns[nCol].ColumnName,
    // PrintFont,Brushes.Black,aRect);
    e.Graphics.DrawString(
     dt.Columns[nCol].ColumnName,
     new Font(PrintFont,FontStyle.Bold),Brushes.Black,aRect.X+(m_nColBounds[nCol]-e.Graphics.MeasureString(
     dt.Columns[nCol].ColumnName,PrintFont).Width)/2,aRect.Y);
    nTextPosX+=(int)m_nColBounds[nCol];

   }
   //}
   nTextPosX=x;
   //nTextPosY+=(int)PrintFont.GetHeight(e.Graphics);
   ///打印内容
   ///

   for(int nRow=m_nCurrRow;nRow<m_nRows;nRow++)
   {
    for(int nCol=0;nCol<m_nColumns;nCol++)
    {
     aRect.X=nTextPosX;
     aRect.Y=nTextPosY;
     aRect.Width=(int)m_nColBounds[nCol];
     aRect.Height=(int)(PrintFont.GetHeight(e.Graphics)*beishu);
     //     if((int)PrintFont.GetHeight(e.Graphics)*(nRow%m_nLinesPerPage)>=GetRealMarginBounds(e).Height)
     //     {
     //      m_nCurrRow=++nRow;
     //      e.HasMorePages=true;
     //     }
     //      if(nRow%2==0)
     //       e.Graphics.FillRectangle(Brushes.White,aRect);
     e.Graphics.DrawRectangle(new Pen(Color.Black,(float)0.1),aRect);
     e.Graphics.DrawString(m_oDataGrid[nRow,nCol].ToString(),
      PrintFont,Brushes.Black,aRect);
      
     nTextPosX+=(int)m_nColBounds[nCol];

    }
    nTextPosX=x;
    nTextPosY+=(int)(PrintFont.GetHeight(e.Graphics)*beishu);

    if(nRow-((m_nCurrPage-1)*m_nLinesPerPage)==m_nLinesPerPage)
    {
     m_nCurrRow=++nRow;
     e.HasMorePages=true;
     //System.Threading.Thread.Sleep(3000);
     return;
    }

   }
   
   

  }


  protected override void OnEndPrint(PrintEventArgs e)
  {
   base.OnEndPrint (e);
   
  }


  [System.Runtime.InteropServices.DllImport("gdi32.dll")]
  static extern int GetDeviceCaps(IntPtr hdc,DeviceCapsIndex index);
  enum DeviceCapsIndex
  {
   physicaloffsetx=112,
   physicaloffsety=113
  }
  
  static Rectangle GetRealMarginBounds(PrintPageEventArgs e)
  {
   int cx=0;
   int cy=0;
   IntPtr hdc=e.Graphics.GetHdc();
   try
   {
    cx=GetDeviceCaps(hdc,DeviceCapsIndex.physicaloffsetx);
    cy=GetDeviceCaps(hdc,DeviceCapsIndex.physicaloffsety);
   }
   finally
   {
    e.Graphics.ReleaseHdc(hdc);
   }
   Rectangle marginBounds=e.MarginBounds;
   int dpix=(int)e.Graphics.DpiX;
   int dpiy=(int)e.Graphics.DpiY;
   marginBounds.Offset(-cx*100/dpix,-cy*100/dpiy);
   return marginBounds;
   
  }

 }
}

原创粉丝点击