![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }