打印类
来源:互联网 发布: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;
}
}
}
- 打印类
- C# 打印 无需自定义打印类
- 一个dataGridview打印类
- 通用打印类
- C#并口打印类
- vb打印类
- DataGridView打印类
- WebBrowser通用打印类
- WebBrowser通用打印类
- 打印datagridview类
- Datagridview打印类
- 票据打印类
- 打印Grid类数据
- DataGridView打印类
- C#票据打印类
- 打印类集合
- 打印类集合
- 打印类集合
- 在程序启动之前显示一个画面
- sqlserver根据IP获取地址的自定义函数
- sqlserver过滤字符串中的空格的自定义函数
- 高中同桌过来看我
- 通用查询对象最优经验
- 打印类
- Sunmast(速马)的个性化书签
- vi使用手册(zt)
- 就叫我孩子
- ASP.NET使aspx页面能接受HTML,asp的页面传送的文件
- 用户菜单权限管理
- suspension(要做一件事情,要么不做,要做就要成功!) 的个性化书签
- 通过对COM接口IPicture的安全封装来实现对多种常见图像格式的操作
- wxWidgets-2.6.1编译和在VC中的配置,及使用后的一点感想