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