public class UPrintFome : PrintDocument
{
#region 自定义函数变量
#region 自定义变量
private bool _IsSaved = false;
private bool _SpecialFxt = false;
public bool IsDisplayPrintDialog = false;
public int _PageNumber; //打印控制变量
private int _PageNum = 0; //打印总页数
private int _PageN = 0; //打印第几页
private string _PrintDocumentName; //打印的文档名
private Font sysFont; //字体格式
private PageSettings _pageSize = new PageSettings(); //纸张大小
private PageDistance _pageDistance = new PageDistance(); //页边距
private Graphics myGr; //绘制区域
//private int iLineNumber; //绘制的行数
private float _fYPosition; //绘制位置Y
private float _fXPosition; //绘制位置X
private int X; //绘制区起始位置X坐标
private int Y; //绘制区起始位置Y坐标
private int _Width; //绘制区宽度
private int _Height; //绘制区高度
private bool pageFace = false; //打印方向
private int irow = 0; //表格每页的开始行数
private int beginrow = 0; //表格每页的开始行数
private int endrow = 0; //表格每页的结束行数
private int krow = 0; //表格空白行数
private PrintDocument print;
private int _PageStarNum = 0; //打印起始页
private int _pageEndNum = 0; //打印末尾页
private bool _bPages = false;
private PrintPreviewDialog dlg;
#endregion
#region 自定义结构
#region 页边距
public struct PageDistance
{
public int left;
public int right;
public int top;
public int foot;
}
#endregion
#region 居左,居中,居右
public enum FontType
{
left,
middle,
right
}
#endregion
#endregion
#region 自定义属性
public int Width
{
get
{
if (!pageFace)
return _Width;
else
return _Height;
}
}
public int Height
{
get
{
if (!pageFace)
return _Height;
else
return _Width;
}
}
public float FontHeight
{
get
{
return sysFont.GetHeight(myGr);
}
}
public int PageBeginRow
{
get
{
return beginrow;
}
set
{
beginrow = value;
}
}
public bool SpecialFxt
{
get
{
return _SpecialFxt;
}
set
{
_SpecialFxt = value;
}
}
public bool IsSaved
{
get
{
return _IsSaved;
}
set
{
_IsSaved = value;
}
}
public bool bPages
{
get
{
return _bPages;
}
set
{
_bPages = value;
}
}
#region 正在打印的页数
public int PageNum
{
get
{
return _PageN;
}
}
#endregion
#endregion
#region 委托事件
#region 绘制打印区
public delegate void UserHandler();
public delegate void UserEventHandler(object sender, FormClosingEventArgs e);
public event UserHandler sPrint;
public event UserHandler SetFxtFlowNo;
// public event UserEventHandler FormClosing;
private void onPrint(object sender, PrintPageEventArgs e)
{
_PageN++;
if (_PageStarNum > 0)
{
while (_PageN < _PageStarNum)
{
myGr = e.Graphics;
//iLineNumber = 0;
X = _pageDistance.left;
Y = _pageDistance.top;
_Width = (int)print.DefaultPageSettings.PrintableArea.Width - _pageDistance.left - _pageDistance.right;
_Height = (int)print.DefaultPageSettings.PrintableArea.Height - _pageDistance.top - _pageDistance.foot;
//_Width = _pageSize.PaperSize.Width - _pageDistance.left - _pageDistance.right - (int)print.DefaultPageSettings.PrintableArea.X;
//_Height = _pageSize.PaperSize.Height - _pageDistance.top - _pageDistance.foot - (int)print.DefaultPageSettings.PrintableArea.Y;
_fYPosition = Y;
_fXPosition = X;
sysFont = new Font("宋体", 10, FontStyle.Regular);
sPrint();
myGr.Clear(Color.White);
_PageN++;
}
}
myGr = e.Graphics;
//iLineNumber = 0;
X = _pageDistance.left;
Y = _pageDistance.top;
_Width = (int)print.DefaultPageSettings.PrintableArea.Width - _pageDistance.left - _pageDistance.right;
_Height = (int)print.DefaultPageSettings.PrintableArea.Height - _pageDistance.top - _pageDistance.foot;
//_Width = _pageSize.PaperSize.Width - _pageDistance.left - _pageDistance.right - (int)print.DefaultPageSettings.PrintableArea.X;
//_Height = _pageSize.PaperSize.Height - _pageDistance.top - _pageDistance.foot - (int)print.DefaultPageSettings.PrintableArea.Y;
_fYPosition = Y;
_fXPosition = X;
sysFont = new Font("宋体", 10, FontStyle.Regular);
sPrint();
if (_pageEndNum != 0 && _PageN == _pageEndNum)
_PageNumber = 0;
_PageNumber--;
if (_PageNumber >= 0)
{
if (_PageNum != 0)
{
if (_PageN <= _PageNum)
{
e.HasMorePages = true;
}
else
e.HasMorePages = false;
}
else
e.HasMorePages = true;
}
else
e.HasMorePages = false;
}
public event UserHandler btnPrint_Click;
#endregion
#region 准备打印
private void beginPrint(object sender, PrintEventArgs e)
{
_PageStarNum = 0;
_pageEndNum = 0;
if (_PageNumber < 0)
{
PrintDialog dlg = new PrintDialog();
dlg.Document = print;
//dlg.AllowCurrentPage = true;
//dlg.AllowSelection = true;
dlg.AllowSomePages = true;
dlg.PrinterSettings.FromPage = 0;
dlg.PrinterSettings.ToPage = 0;
try
{
btnPrint_Click();
}
catch { }
if (dlg.ShowDialog() != DialogResult.OK)
{
e.Cancel = true;
return;
}
else
{
_PageStarNum = dlg.PrinterSettings.FromPage;
_pageEndNum = dlg.PrinterSettings.ToPage;
if (SpecialFxt)
{
SetFxtFlowNo();
}
}
}
irow = 0; //表格每页的开始行数
beginrow = 0; //表格每页的开始行数
endrow = 0; //表格每页的结束行数
krow = 0;
_PageN = 0;
_PageNumber = _PageNum - 1;
if (_PageNumber < 0)
{
_PageNumber = 0;
}
}
#endregion
#endregion
#region 自定义函数
public void SetSystemFont(Font font)
{
sysFont = font;
}
public Font GetFont(string strFontName, int FontSize, FontStyle fsStyle)
{
Font f = new Font(strFontName, FontSize, fsStyle);
return f;
}
#region 打印预设置
#region 设置打印的页数
public int PageNumber
{
get
{
return _PageNum;
}
set
{
int i = value;
if (i < 0)
{
i = 0;
}
_PageNum = i;
}
}
#endregion
#region 设置打印的名称
public string PrintDocumentName
{
get
{
return _PrintDocumentName;
}
set
{
_PrintDocumentName = value;
}
}
#endregion
#region 设置默认纸张大小
public void SetPaperSize(string strName, int weigh, int height)
{
_pageSize.PaperSize = new PaperSize(strName, weigh, height);
return;
}
#endregion
#region 设置打印方向
public bool PageFace
{
get
{
return pageFace;
}
set
{
pageFace = value;
}
}
#endregion
#region 设置页边距,单位为英制
public PageDistance pageDistance
{
get
{
return _pageDistance;
}
set
{
_pageDistance = value;
}
}
#endregion
#region 绘制点的位置
public float fXPosition
{
get
{
return _fXPosition;
}
set
{
_fXPosition = value;
}
}
public float fYPosition
{
get
{
return _fYPosition;
}
set
{
_fYPosition = value;
}
}
#endregion
#endregion
#region 绘制打印
#region 基本绘制
#region 绘制图像
public void DrawImage(Image img, int x, int y, int w, int h)
{
myGr.DrawImage (img ,x,y ,w ,h );
return;
}
#endregion
#region 绘制一条直线
public void DrawLine(Point p1, Point p2)
{
Pen p = new Pen(Color.Black, 1);
myGr.DrawLine(p, p1, p2);
return;
}
#endregion
#region 绘制一个矩形框
public void DrawRect(Point point, int w, int h)
{
Pen p = new Pen(Color.Black, 1);
myGr.DrawRectangle(p, point.X, point.Y, w, h);
return;
}
#endregion
#region 绘制文字
public void DrawString(string strText, Color color, float X, float Y, float w, FontType fonttype, bool b)
{
int iFont = 0;
DrawString(strText, color, X, Y, w, fonttype, b, iFont);
}
public void DrawString(string strText, Color color, float X, float Y, float w, FontType fonttype, bool b, int iFont)
{
StringFormat format = new StringFormat();
RectangleF rc = new RectangleF();
Font f = new Font(sysFont.Name, sysFont.Size - iFont, sysFont.Style);
//myGr.PageUnit = GraphicsUnit.Pixel;
if (b)
{
#region 分左、中、右三种情况
RectangleF r = new RectangleF();
switch (fonttype)
{
case FontType.left:
format.Alignment = StringAlignment.Near;
rc.X = X;
rc.Y = Y;
rc.Width = w;
r.X = X + iFont;
r.Y = Y + iFont;
r.Width = w;
myGr.DrawString(strText, f, new SolidBrush(color), r, format);
break;
case FontType.middle:
format.Alignment = StringAlignment.Center;
rc.X = X;
rc.Y = Y;
rc.Width = w;
r.X = X + iFont;
r.Y = Y + iFont;
r.Width = w;
myGr.DrawString(strText, f, new SolidBrush(color), r, format);
break;
case FontType.right:
format.Alignment = StringAlignment.Far;
rc.X = X;
rc.Y = Y;
rc.Width = w;
r.X = X + iFont;
r.Y = Y + iFont;
r.Width = w;
myGr.DrawString(strText, f, new SolidBrush(color), r, format);
break;
}
#endregion
int iLine = 0;
float W = (float)((myGr.MeasureString(strText, sysFont).Width) * 1.1);
while (W > 0)
{
iLine++;
W -= w;
}
_fYPosition += iLine * sysFont.GetHeight(myGr);
}
else
{
#region 分左、中、右三种情况
RectangleF r = new RectangleF();
switch (fonttype)
{
case FontType.left:
format.Alignment = StringAlignment.Near;
rc.X = X;
rc.Y = Y;
rc.Width = w;
rc.Height = sysFont.GetHeight(myGr);
r.X = X + iFont;
r.Y = Y + iFont;
r.Width = w;
r.Height = f.GetHeight(myGr);
myGr.DrawString(strText, f, new SolidBrush(color), r, format);
break;
case FontType.middle:
format.Alignment = StringAlignment.Center;
rc.X = X;
rc.Y = Y;
rc.Width = w;
rc.Height = sysFont.GetHeight(myGr);
r.X = X + iFont;
r.Y = Y + iFont;
r.Width = w;
r.Height = f.GetHeight(myGr);
myGr.DrawString(strText, f, new SolidBrush(color), r, format);
break;
case FontType.right:
format.Alignment = StringAlignment.Far;
rc.X = X;
rc.Y = Y;
rc.Width = w;
rc.Height = sysFont.GetHeight(myGr);
r.X = X + iFont;
r.Y = Y + iFont;
r.Width = w;
r.Height = f.GetHeight(myGr);
myGr.DrawString(strText, f, new SolidBrush(color), r, format);
break;
}
#endregion
_fYPosition += rc.Height;
}
}
#endregion
#region 换行
public void DrawNewLine()
{
_fXPosition = pageDistance.left;
_fYPosition += sysFont.GetHeight(myGr);
}
#endregion
#region 绘制表格
///
/// <summary>
/// p为左上角点;
/// height为表格的高度;
/// width为表格的宽度;
/// tab为需要绘制的表格;
/// b 为是否自动换行;
/// cellHeight为列的宽度百分比;
/// fonttype为表格内容是左对齐还是右对齐或者居中对齐
/// </summary>
///
public void DrawTab(Point p, int height, int width, DataTable tab)
{
DrawTab(p, height, width, tab, false);
}
public void DrawTab(Point p, int height, int width, DataTable tab, bool b)
{
float w = width / tab.Columns.Count;
float[] col = new float[tab.Columns.Count];
for (int i = 0; i < tab.Columns.Count; i++)
{
col[i] = w / width;
}
DrawTab(p, height, width, tab, b, col);
}
public void DrawTab(Point p, int height, int width, DataTable tab, float[] CellHeight)
{
DrawTab(p, height, width, tab, false, CellHeight);
}
public void DrawTab(Point p, int height, int width, DataTable tab, float[] CellHeight, FontType fonttype)
{
DrawTab(p, height, width, tab, false, CellHeight, fonttype);
}
public void DrawTab(Point p, int height, int width, DataTable tab, bool b, float[] CellHeight)
{
DrawTab(p, height, width, tab, false, CellHeight, FontType.middle);
}
public void DrawTab(Point p, int height, int width, DataTable tab, bool b, float[] CellHeight, FontType fonttype)
{
int iFont = 0;
DrawTab(p, height, width, tab, b, CellHeight, iFont, fonttype);
}
public void DrawTab(Point p, int height, int width, DataTable tab, bool b, float[] CellHeight, FontType fonttype,bool flg)
{
int iFont = 0;
DrawTab(p, height, width, tab, b, CellHeight, iFont, fonttype,flg );
}
public void DrawTab(Point p, int height, int width, DataTable tab, bool b, float[] CellHeight, int iFont, FontType fonttype)
{
if (tab == null)
return;
height += 1; // 补偿偏移
#region 先绘制一个矩形框
DrawRect(p, width, height);
#endregion
#region 绘制表头
int col = tab.Columns.Count;
int x = p.X;
int y = (int)_fYPosition;
float maxh = 0;
for (int i = 0; i < tab.Columns.Count; i++)
{
DrawString(tab.Columns[i].ColumnName.Trim(), Color.Black, x, y, CellHeight[i] * width, FontType.middle, b, iFont);
x += (int)(CellHeight[i] * width);
if (maxh < _fYPosition - y)
{
maxh = (int)_fYPosition - y;
}
_fYPosition = y;
if (i != tab.Columns.Count - 1)
{
Point p1 = new Point();
p1.X = x;
p1.Y = p.Y;
Point p2 = new Point();
p2.X = x;
p2.Y = p.Y + height;
DrawLine(p1, p2);
}
}
_fYPosition += maxh;
Point po1 = new Point();
po1.X = p.X;
po1.Y = (int)_fYPosition;
Point po2 = new Point();
po2.X = p.X + width;
po2.Y = (int)_fYPosition;
DrawLine(po1, po2);
#endregion
#region 绘制表明细
beginrow = irow;
for (int iRow = irow; iRow < tab.Rows.Count; iRow++)
{
#region 初始化初值
x = p.X;
y = (int)_fYPosition;
maxh = 0;
#endregion
#region 绘制列
for (int iCol = 0; iCol < tab.Columns.Count; iCol++)
{
DrawString(tab.Rows[iRow][iCol].ToString(), Color.Black, x, y, CellHeight[iCol] * width, fonttype, b, iFont);
x += (int)(CellHeight[iCol] * width);
if (maxh < _fYPosition - y)
{
maxh = _fYPosition - y;
}
_fYPosition = y;
}
_fYPosition += maxh;
endrow = iRow;
#endregion
#region 判断是否分页
if (iRow + 1 != tab.Rows.Count)
{
int pagenum = _PageNumber;
for (int iCol = 0; iCol < tab.Columns.Count; iCol++)
{
int iLine = 0;
if (b)
{
float W = (float)(myGr.MeasureString(tab.Rows[iRow + 1][iCol].ToString(), sysFont).Width * 1.1);
while (W > 0)
{
iLine++;
W -= (CellHeight[iCol] * width);
}
}
else
{
iLine = 1;
}
if (_fYPosition + iLine * sysFont.GetHeight(myGr) > p.Y + height)
{
irow = iRow + 1;
_PageNumber++;
break;
}
}
if (pagenum != _PageNumber)
return;
}
#endregion
#region 绘制横线
Point p1 = new Point();
p1.X = p.X;
p1.Y = (int)_fYPosition;
Point p2 = new Point();
p2.X = p.X + width;
p2.Y = (int)_fYPosition;
DrawLine(p1, p2);
#endregion
}
#endregion
#region 将表格填满
do
{
krow++;
#region 绘制横线
Point p1 = new Point();
p1.X = p.X;
p1.Y = (int)_fYPosition;
Point p2 = new Point();
p2.X = p.X + width;
p2.Y = (int)_fYPosition;
DrawLine(p1, p2);
#endregion
_fYPosition += sysFont.GetHeight(myGr);
}
while (_fYPosition + sysFont.GetHeight(myGr) < p.Y + height);
#endregion
}
public void DrawTab1(Point p, int height, int width, DataTable tab, bool b, float[] CellHeight, int iFont, FontType fonttype)
{
if (tab == null)
return;
height += 1; // 补偿偏移
#region 先绘制一个矩形框
DrawRect(p, width, height);
#endregion
#region 绘制表头
int col = tab.Columns.Count;
int x = p.X;
int y = (int)_fYPosition;
float maxh = 0;
for (int i = 0; i < tab.Columns.Count; i++)
{
DrawString(tab.Columns[i].ColumnName.Trim(), Color.Black, x, y, CellHeight[i] * width, FontType.middle, b, iFont);
x += (int)(CellHeight[i] * width);
if (maxh < _fYPosition - y)
{
maxh = (int)_fYPosition - y;
}
_fYPosition = y;
if (i != tab.Columns.Count - 1)
{
Point p1 = new Point();
p1.X = x;
p1.Y = p.Y;
Point p2 = new Point();
p2.X = x;
p2.Y = p.Y + height;
DrawLine(p1, p2);
}
}
_fYPosition += maxh;
Point po1 = new Point();
po1.X = p.X;
po1.Y = (int)_fYPosition;
Point po2 = new Point();
po2.X = p.X + width;
po2.Y = (int)_fYPosition;
DrawLine(po1, po2);
#endregion
#region 绘制表明细
beginrow = irow;
for (int iRow = irow; iRow < tab.Rows.Count; iRow++)
{
#region 初始化初值
x = p.X;
y = (int)_fYPosition;
maxh = 0;
#endregion
#region 绘制列
for (int iCol = 0; iCol < tab.Columns.Count; iCol++)
{
DrawString(tab.Rows[iRow][iCol].ToString(), Color.Black, x, y, CellHeight[iCol] * width, fonttype, b, iFont);
x += (int)(CellHeight[iCol] * width);
if (maxh < _fYPosition - y)
{
maxh = _fYPosition - y;
}
_fYPosition = y;
}
_fYPosition += maxh;
endrow = iRow;
#endregion
#region 判断是否分页
if (iRow + 1 != tab.Rows.Count)
{
int pagenum = _PageNumber;
for (int iCol = 0; iCol < tab.Columns.Count; iCol++)
{
int iLine = 0;
if (b)
{
float W = (float)(myGr.MeasureString(tab.Rows[iRow + 1][iCol].ToString(), sysFont).Width * 1.1);
while (W > 0)
{
iLine++;
W -= (CellHeight[iCol] * width);
}
}
else
{
iLine = 1;
}
if (_fYPosition + iLine * sysFont.GetHeight(myGr) > p.Y + height)
{
_bPages = true;
dlg.DialogResult = DialogResult.Cancel;
MessageBox.Show("此放行条需分页打印,请重新打印");
irow = iRow + 1;
_PageNumber++;
break;
}
}
if (pagenum != _PageNumber)
return;
}
#endregion
#region 绘制横线
Point p1 = new Point();
p1.X = p.X;
p1.Y = (int)_fYPosition;
Point p2 = new Point();
p2.X = p.X + width;
p2.Y = (int)_fYPosition;
DrawLine(p1, p2);
#endregion
}
#endregion
#region 将表格填满
do
{
krow++;
#region 绘制横线
Point p1 = new Point();
p1.X = p.X;
p1.Y = (int)_fYPosition;
Point p2 = new Point();
p2.X = p.X + width;
p2.Y = (int)_fYPosition;
DrawLine(p1, p2);
#endregion
_fYPosition += sysFont.GetHeight(myGr);
}
while (_fYPosition + sysFont.GetHeight(myGr) < p.Y + height);
#endregion
}
public void DrawTab2(Point p, int height, int width, DataTable tab, bool b, float[] CellHeight, int iFont, FontType fonttype)
{
if (tab == null)
return;
height += 1; // 补偿偏移
#region 先绘制一个矩形框
DrawRect(p, width, height);
#endregion
#region 绘制表头
int col = tab.Columns.Count;
int x = p.X;
int y = (int)_fYPosition;
float maxh = 0;
for (int i = 0; i < tab.Columns.Count; i++)
{
DrawString(tab.Columns[i].ColumnName.Trim(), Color.Black, x, y, CellHeight[i] * width, FontType.middle, b, iFont);
x += (int)(CellHeight[i] * width);
if (maxh < _fYPosition - y)
{
maxh = (int)_fYPosition - y;
}
_fYPosition = y;
if (i != tab.Columns.Count - 1)
{
Point p1 = new Point();
p1.X = x;
p1.Y = p.Y;
Point p2 = new Point();
p2.X = x;
p2.Y = p.Y + height;
DrawLine(p1, p2);
}
}
_fYPosition += maxh;
Point po1 = new Point();
po1.X = p.X;
po1.Y = (int)_fYPosition;
Point po2 = new Point();
po2.X = p.X + width;
po2.Y = (int)_fYPosition;
DrawLine(po1, po2);
#endregion
#region 绘制表明细
beginrow = irow;
for (int iRow = irow; iRow < tab.Rows.Count; iRow++)
{
#region 初始化初值
x = p.X;
y = (int)_fYPosition;
maxh = 0;
#endregion
#region 绘制列
for (int iCol = 0; iCol < tab.Columns.Count; iCol++)
{
DrawString(tab.Rows[iRow][iCol].ToString(), Color.Black, x, y, CellHeight[iCol] * width, fonttype, b, iFont);
x += (int)(CellHeight[iCol] * width);
if (maxh < _fYPosition - y)
{
maxh = _fYPosition - y;
}
_fYPosition = y;
}
_fYPosition += maxh;
endrow = iRow;
#endregion
#region 判断是否分页
//if (iRow + 1 != tab.Rows.Count)
//{
// int pagenum = _PageNumber;
// for (int iCol = 0; iCol < tab.Columns.Count; iCol++)
// {
// int iLine = 0;
// if (b)
// {
// float W = (float)(myGr.MeasureString(tab.Rows[iRow + 1][iCol].ToString(), sysFont).Width * 1.1);
// while (W > 0)
// {
// iLine++;
// W -= (CellHeight[iCol] * width);
// }
// }
// else
// {
// iLine = 1;
// }
// if (_fYPosition + iLine * sysFont.GetHeight(myGr) > p.Y + height)
// {
// dlg.DialogResult = DialogResult.Cancel;
// MessageBox.Show("此放行条需分页打印,请重新打印");
// irow = iRow + 1;
// _PageNumber++;
// break;
// }
// }
// if (pagenum != _PageNumber)
// return;
//}
#endregion
#region 绘制横线
Point p1 = new Point();
p1.X = p.X;
p1.Y = (int)_fYPosition;
Point p2 = new Point();
p2.X = p.X + width;
p2.Y = (int)_fYPosition;
DrawLine(p1, p2);
#endregion
}
#endregion
#region 将表格填满
do
{
krow++;
#region 绘制横线
Point p1 = new Point();
p1.X = p.X;
p1.Y = (int)_fYPosition;
Point p2 = new Point();
p2.X = p.X + width;
p2.Y = (int)_fYPosition;
DrawLine(p1, p2);
#endregion
_fYPosition += sysFont.GetHeight(myGr);
}
while (_fYPosition + sysFont.GetHeight(myGr) < p.Y + height);
#endregion
}
/// <summary>
/// 绘制表
/// </summary>
/// <param name="p">起绘点</param>
/// <param name="height">高度</param>
/// <param name="width">宽度</param>
/// <param name="tab">DatatTable表</param>
/// <param name="b">是否换行</param>
/// <param name="CellHeight">列宽比例</param>
/// <param name="iFont">字体</param>
/// <param name="fonttype">字体对齐</param>
/// <param name="flg">是否表格填充空白</param>
public void DrawTab(Point p, int height, int width, DataTable tab, bool b, float[] CellHeight, int iFont, FontType fonttype, bool flg)
{
if (tab == null)
return;
height += 1; // 补偿偏移
#region 先绘制一个矩形框
DrawRect(p, width, height);
#endregion
#region 绘制表头
int col = tab.Columns.Count;
int x = p.X;
int y = (int)_fYPosition;
float maxh = 0;
for (int i = 0; i < tab.Columns.Count; i++)
{
DrawString(tab.Columns[i].ColumnName.Trim(), Color.Black, x, y, CellHeight[i] * width, FontType.middle, b, iFont);
x += (int)(CellHeight[i] * width);
if (maxh < _fYPosition - y)
{
maxh = (int)_fYPosition - y;
}
_fYPosition = y;
if (i != tab.Columns.Count - 1)
{
Point p1 = new Point();
p1.X = x;
p1.Y = p.Y;
Point p2 = new Point();
p2.X = x;
p2.Y = p.Y + (int)sysFont.GetHeight(myGr);
DrawLine(p1, p2);
}
}
_fYPosition += maxh;
Point po1 = new Point();
po1.X = p.X;
po1.Y = (int)_fYPosition;
Point po2 = new Point();
po2.X = p.X + width;
po2.Y = (int)_fYPosition;
DrawLine(po1, po2);
#endregion
#region 绘制表明细
beginrow = irow;
for (int iRow = irow; iRow < tab.Rows.Count; iRow++)
{
#region 初始化初值
x = p.X;
y = (int)_fYPosition;
maxh = 0;
#endregion
#region 绘制列
for (int iCol = 0; iCol < tab.Columns.Count; iCol++)
{
DrawString(tab.Rows[iRow][iCol].ToString(), Color.Black, x, y, CellHeight[iCol] * width, fonttype, b, iFont);
x += (int)(CellHeight[iCol] * width);
if (maxh < _fYPosition - y)
{
maxh = _fYPosition - y;
}
_fYPosition = y;
if (iCol != tab.Columns.Count - 1)
{
Point p21 = new Point();
p21.X = x;
p21.Y = p.Y;
Point p22 = new Point();
p22.X = x;
p22.Y = p.Y + (int)sysFont.GetHeight(myGr);
DrawLine(p21, p22);
}
}
_fYPosition += maxh;
endrow = iRow;
#endregion
#region 判断是否分页
if (iRow + 1 != tab.Rows.Count)
{
int pagenum = _PageNumber;
for (int iCol = 0; iCol < tab.Columns.Count; iCol++)
{
int iLine = 0;
if (b)
{
float W = (float)(myGr.MeasureString(tab.Rows[iRow + 1][iCol].ToString(), sysFont).Width * 1.1);
while (W > 0)
{
iLine++;
W -= (CellHeight[iCol] * width);
}
}
else
{
iLine = 1;
}
if (_fYPosition + iLine * sysFont.GetHeight(myGr) > p.Y + height)
{
irow = iRow + 1;
_PageNumber++;
break;
}
}
if (pagenum != _PageNumber)
return;
}
#endregion
#region 绘制横线
Point p1 = new Point();
p1.X = p.X;
p1.Y = (int)_fYPosition;
Point p2 = new Point();
p2.X = p.X + width;
p2.Y = (int)_fYPosition;
DrawLine(p1, p2);
#endregion
}
#endregion
#region 将表格填满
if (flg)
{
do
{
krow++;
#region 绘制横线
Point p1 = new Point();
p1.X = p.X;
p1.Y = (int)_fYPosition;
Point p2 = new Point();
p2.X = p.X + width;
p2.Y = (int)_fYPosition;
DrawLine(p1, p2);
#endregion
_fYPosition += sysFont.GetHeight(myGr);
}
while (_fYPosition + sysFont.GetHeight(myGr) < p.Y + height);
}
else _fYPosition = p.Y + height - sysFont.GetHeight(myGr);
#endregion
}
#endregion
#endregion
#region 标题
#endregion
#region 页眉
public void DrawHead()
{
}
#endregion
#region 页脚
public void DrawFoot()
{
}
#endregion
#endregion
public void ShowPrint()
{
print = new PrintDocument();
print.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(onPrint);
print.BeginPrint += new System.Drawing.Printing.PrintEventHandler(beginPrint);
PageSetupDialog psdlg = new PageSetupDialog();
print.DefaultPageSettings = _pageSize;
print.DocumentName = _PrintDocumentName;
print.DefaultPageSettings.Landscape = pageFace;
irow = 0; //表格每页的开始行数
beginrow = 0; //表格每页的开始行数
endrow = 0; //表格每页的结束行数
krow = 0;
_PageNumber = _PageNum - 1;
if (_PageNumber < 0)
{
_PageNumber = 0;
}
_PageN = 0;
dlg = new PrintPreviewDialog();
dlg.Document = print;
dlg.PrintPreviewControl.Zoom = 1;
try
{
((System.Windows.Forms.Form)dlg).WindowState = FormWindowState.Maximized;
dlg.ShowDialog();
}
catch
{
;
}
}
public void ShowPrint(UPrintPreviewDialog dlg)
{
print = new PrintDocument();
print.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(onPrint);
print.BeginPrint += new System.Drawing.Printing.PrintEventHandler(beginPrint);
PageSetupDialog psdlg = new PageSetupDialog();
print.DefaultPageSettings = _pageSize;
print.DocumentName = _PrintDocumentName;
print.DefaultPageSettings.Landscape = pageFace;
irow = 0; //表格每页的开始行数
beginrow = 0; //表格每页的开始行数
endrow = 0; //表格每页的结束行数
krow = 0;
_PageNumber = _PageNum - 1;
if (_PageNumber < 0)
{
_PageNumber = 0;
}
_PageN = 0;
dlg.Document = print;
dlg.PrintPreviewControl.Zoom = 1;
try
{
((System.Windows.Forms.Form)dlg).WindowState = FormWindowState.Maximized;
dlg.ShowDialog();
}
catch
{
;
}
}
public int GetPageBeginRow()
{
return beginrow;
}
public int GetPageEndRow()
{
return endrow;
}
public int GetPageKRow()
{
return krow;
}
public float GetTextWidth(string str)
{
return myGr.MeasureString(str, sysFont).Width;
}
#endregion
#endregion
}