zoukankan      html  css  js  c++  java
  • 打印控件

     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
        }
    View Code
  • 相关阅读:
    [ASPNET2.0]Membership类+SQLServer2005,AspNet_regsql.exe的使用
    Tooltip的几个技巧(转自网络)
    使用aspnet_regsql.ext命令行工具后,就不能用sql语句创建新的表了,总是显示已存在XXX对象。
    我已经无可救药
    陈彩君(帮别人名字作诗)
    震后首游都江堰感怀(二)
    克服创业前的恐惧:31条建议帮你有勇气做自己的老板
    想你已经成为了一种习惯
    诸葛亮给儿子上的十堂课
    一生中,这8种朋友是你的无价之宝
  • 原文地址:https://www.cnblogs.com/zlcom/p/3499109.html
Copyright © 2011-2022 走看看