C#编程之C# winform绘图图面打印功能
小标 2018-12-14 来源 : 阅读 1399 评论 0

摘要:本文主要向大家介绍了C#编程之C# winform绘图图面打印功能,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。

本文主要向大家介绍了C#编程之C#  winform绘图图面打印功能,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。

打印类代码如下:
public class Printer
    {
        private DataGridView dataview;
        private PrintDocument printDoc;
        private Font printFontStyle;
        //打印有效区域的宽度
        int width;
        int height;
        int columns;
        double Rate;//打印宽度和纸张的比例
        bool hasMorePage = false;//是否跨页
        int currRow = 0;
        int rowHeight = 61;
        //打印页数
        int PageNumber;
        //当前打印页的行数,默认打印行数
        int pageSize = 20;
        //当前打印的页码
        int PageIndex=0;

        int AreaHeight;

        private int PageWidth; //打印纸的宽度
        private int PageHeight; //打印纸的高度
        private int LeftMargin; //有效打印区距离打印纸的左边大小
        private int TopMargin;//有效打印区距离打印纸的上面大小
        private int RightMargin;//有效打印区距离打印纸的右边大小
        private int BottomMargin;//有效打印区距离打印纸的下边大小

        int rows;


        private string[] footer;

       
        //// 


        /// 构造函数
        /// 


        /// 

要打印的DateGridView
        /// 

PrintDocument用于获取打印机的设置
        public Printer(DataGridView dataview, Font fontStyle, PrintDocument printDoc,  string[] footer)
        {
            this.footer = footer;

            this.dataview = dataview;
            this.printDoc = printDoc;
            this.printFontStyle = fontStyle;
            //PageIndex = 0;
            //获取打印数据的具体行数
            this.rows = dataview.RowCount-1;

            this.columns = dataview.ColumnCount;
            //判断打印设置是否是横向打印
            if (!printDoc.DefaultPageSettings.Landscape)
            {

                PageWidth = printDoc.DefaultPageSettings.PaperSize.Width;
                PageHeight = printDoc.DefaultPageSettings.PaperSize.Height;
            }
            else
            {
                PageHeight = printDoc.DefaultPageSettings.PaperSize.Width;
                PageWidth = printDoc.DefaultPageSettings.PaperSize.Height;
            }
            LeftMargin = printDoc.DefaultPageSettings.Margins.Left<20?20: printDoc.DefaultPageSettings.Margins.Left;
            TopMargin = printDoc.DefaultPageSettings.Margins.Top<20?20: printDoc.DefaultPageSettings.Margins.Top;
            RightMargin = printDoc.DefaultPageSettings.Margins.Right < 20 ? 20: printDoc.DefaultPageSettings.Margins.Right;
            BottomMargin = printDoc.DefaultPageSettings.Margins.Bottom < 20 ? 20 : printDoc.DefaultPageSettings.Margins.Bottom;


            height = PageHeight - TopMargin - BottomMargin - 5;
            width = PageWidth - LeftMargin - RightMargin - 5;

            double tempheight = height;
            double temprowHeight = rowHeight;
            while (true)
            {
                string temp = Convert.ToString(tempheight / Math.Round(temprowHeight, 3));
                int i = temp.IndexOf(‘.‘);
                double tt = 100;
                if (i != -1)
                {
                    tt = Math.Round(Convert.ToDouble(temp.Substring(temp.IndexOf(‘.‘))), 3);
                }
                if (tt <= 0.01)
                {
                    rowHeight = Convert.ToInt32(temprowHeight);
                    break;
                }
                else
                {
                    temprowHeight = temprowHeight + 0.01;
                }
            }
            pageSize = height / rowHeight;
            if ((rows + 1) <= pageSize)
            {
                pageSize = rows + 1;
                PageNumber = 1;
            }
            else
            {
                PageNumber = rows / (pageSize - 1);
                if (rows % (pageSize - 1) != 0)
                {
                    PageNumber = PageNumber + 1;
                }

            }

        }


        /// 


        /// 初始化打印
        /// 


        private void InitPrint()
        {
            PageIndex = PageIndex + 1;
            if (PageIndex == PageNumber)
            {
                hasMorePage = false;
                if (PageIndex != 1)
                {
                    pageSize = rows % (pageSize - 1) + 1;
                }
            }
            else
            {
                hasMorePage = true;
            }

        }

        //打印头
        private void DrawHeader(Graphics g)
        {
            //根据比例调整字体大小
            double newsize = (printFontStyle.Size / Rate);
            if (newsize <= 10)
            {
                newsize = 10;
            }
            Font newfont = new Font("宋体", (float)newsize, FontStyle.Regular);
            int temptop = (rowHeight / 2) + TopMargin + 1;
            int templeft = LeftMargin + 1;

            for (int i = 0; i < this.columns; i++)
            {
                string headString = this.dataview.Columns[i].HeaderText;
                float fontHeight = g.MeasureString(headString, newfont).Height;
                float fontwidth = g.MeasureString(headString, newfont).Width;
                float temp = temptop - (fontHeight) / 3;
                int colWidth = (int)(this.dataview.Columns[i].Width / Rate);
                int newtempleft = 0;
                //判读内容是否比宽度长
                if (colWidth > fontwidth)//居中
                {
                    newtempleft = templeft + (int)((float)colWidth- fontwidth) / 2 + 1;
                }
                else
                {
                    while (true)
                    {
                        if (fontwidth <= colWidth)
                        {
                            break;
                        }
                        else
                        {
                            headString = headString.Substring(0, headString.Length - 1);
                            fontwidth = g.MeasureString(headString, newfont).Width;
                        }
                    }
                    newtempleft = templeft + (int)((float)colWidth - fontwidth) / 2 + 1;
                }
                g.DrawString(headString, newfont, Brushes.Black, new PointF(newtempleft, temp));
                templeft = templeft + (int)(this.dataview.Columns[i].Width / Rate) + 1;
            }

        }

        //画表格
        private void DrawTable(Graphics g)
        {
            Rectangle border = new Rectangle(LeftMargin, TopMargin, width, (pageSize) * rowHeight);
            g.DrawRectangle(new Pen(Brushes.Black, 1), border);
            for (int i = 1; i < pageSize; i++)
            {
                if (i != 1)
                {
                    g.DrawLine(new Pen(Brushes.Black, 1), new Point(LeftMargin + 1, (rowHeight * i) + TopMargin + 1), new Point(width + LeftMargin, (rowHeight * i) + TopMargin + 1));
                }
                else
                {
                    g.DrawLine(new Pen(Brushes.Black, 1), new Point(LeftMargin + 1, (rowHeight * i) + TopMargin + 1), new Point(width + LeftMargin, (rowHeight * i) + TopMargin + 1));
                }
            }

            //计算出列的总宽度和打印纸比率
            Rate = Convert.ToDouble(GetDateViewWidth()) / Convert.ToDouble(width);
            int tempLeft = LeftMargin + 1;
            int endY = (pageSize) * rowHeight + TopMargin;
            for (int i = 1; i < columns; i++)
            {
                tempLeft = tempLeft + 1 + (int)(this.dataview.Columns[i - 1].Width / Rate);
                g.DrawLine(new Pen(Brushes.Black, 1), new Point(tempLeft, TopMargin), new Point(tempLeft, endY));
            }

        }

        /// 


        /// 获取打印的列的总宽度
        /// 


        /// 


        private int GetDateViewWidth()
        {
            int total = 0;
            for (int i = 0; i < this.columns; i++)
            {
                total = total + this.dataview.Columns[i].Width;
            }
            return total;
        }

        //打印行数据
        private void DrawRows(Graphics g)
        {

            //Font font = new Font("宋体", 11, FontStyle.Regular);
            //根据比例调整字体大小
            double newsize = (printFontStyle.Size / Rate);
            if (newsize <= 10)
            {
                newsize = 10;
            }
            Font newfont = new Font("宋体", (float)newsize, FontStyle.Regular);
            int temptop = (rowHeight / 2) + TopMargin + 1 + rowHeight;//垂直居中
            for (int i = currRow; i < pageSize + currRow - 1; i++)
            {
                int templeft = LeftMargin + 1;
                for (int j = 0; j < columns; j++)
                {
                    string headString = this.dataview.Rows[i].Cells[j].Value==null?"":this.dataview.Rows[i].Cells[j].Value.ToString();
                    float fontHeight = g.MeasureString(headString, newfont).Height;
                    float fontwidth = g.MeasureString(headString, newfont).Width;
                    int colWidth = (int)(this.dataview.Columns[j].Width / Rate);
                    float temp = temptop - (fontHeight) / 3;

                    int newtempleft = 0;
                    //判读内容是否比宽度长
                    if (colWidth > fontwidth)//居中
                    {
                        newtempleft = templeft + (int)((float)colWidth - fontwidth) / 2 + 1;
                        g.DrawString(headString, newfont, Brushes.Black, new PointF(newtempleft, temp));
                    }
                    else
                    {
                       // int line= Math.Ceiling((double)(fontwidth / colWidth));
                        string tempi = Convert.ToString((double)(fontwidth /colWidth));
                        string []tei = tempi.Split(‘.‘);
                        int line = int.Parse(tei[0])+ (tei.Count()>0?1:0);
                        int lineWidth = (int)headString.Length / line;
                        string newHeadString = "";
                        string lastHeadString = headString;
                        int linti = 0;
                        while (true)
                        {
                            linti++;
                            newHeadString += lastHeadString.Substring(0, lineWidth> lastHeadString.Length? lastHeadString.Length: lineWidth) + "\r\n";
                            if (lineWidth <= lastHeadString.Length)
                            {
                                lastHeadString = lastHeadString.Substring(lineWidth, lastHeadString.Length - lineWidth);
                            }
                            else
                            { lastHeadString = ""; }
                            if(lastHeadString=="")
                                break;

                            //if (fontwidth <= colWidth)
                            //{
                            //    break;
                            //}
                            //else
                            //{
                            //    headString = headString.Substring(0, headString.Length - 1);
                            //    fontwidth = g.MeasureString(headString, newfont).Width;
                            //}
                        }
                        headString = newHeadString.TrimEnd(‘n‘,‘\\‘,‘r‘);
                        newtempleft = templeft + (int)((float)colWidth - fontwidth/ line) / 2 + 1;
                        //newtempleft = templeft;
                        temp = linti * fontHeight > rowHeight? (temp- fontHeight) :(temp-(fontHeight / 3)* (line-1));
                        g.DrawString(headString, newfont, Brushes.Black, new PointF(newtempleft, temp ));
                    }
                    
                   

                    templeft = templeft + (int)(this.dataview.Columns[j].Width / Rate) + 1;
                }

                temptop = temptop + rowHeight;
            }
            currRow = pageSize + currRow - 1;

            AreaHeight = temptop;

        }

        /// 


        /// 在PrintDocument中的PrintPage方法中调用
        /// 


        /// 

传入PrintPage中PrintPageEventArgs中的Graphics
        /// 

是否还有打印页 有返回true,无则返回false


        public bool Print(Graphics g)
        {
            InitPrint();
            DrawTable(g);
            DrawHeader(g);
            DrawRows(g);
            //打印页码
            string pagestr = PageIndex + " / " + PageNumber;
            Font font = new System.Drawing.Font("宋体", 11, FontStyle.Regular);
            g.DrawString(pagestr, font, Brushes.Black, new PointF((PageWidth / 2) - g.MeasureString(pagestr, font).Width, PageHeight - (BottomMargin / 2) - g.MeasureString(pagestr, font).Height));
            // 打印查询的功能项名称

            return hasMorePage;
        }

    }

View Code

主要运用打印类如下:


 1.打印预览调用
Font txtFont = new Font("宋体", 12, FontStyle.Regular);//正文字体                newPrint = new Printer(printDataGridView, txtFont, pd, null);                pd.PrintPage += new PrintPageEventHandler(printDocument_PrintPage);
if (printDataGridView.Rows.Count > 0)                {                    bool hasMorePage=newPrint.Print(ev.Graphics);                    ev.HasMorePages = hasMorePage;                }                else                {                    MessageBox.Show("没有需要打印的数据");                }
2.打印预览调用
 if (!flag)            {                Font txtFont = new Font("宋体", 12, FontStyle.Regular);//正文字体                newPrint = new Printer(printDataGridView, txtFont, pd, null);                pd.PrintPage -= new PrintPageEventHandler(printDocument_PrintPage);                pd.PrintPage += new PrintPageEventHandler(printDocument_PrintPage);            }            previewDialog.Document = pd;//指向要打印的对象            previewDialog.ShowDialog();//打印预览对话框显示出来
3.打印设置
private void printDialog_Click(object sender, EventArgs e)        {            pageSetupDialog.Document = pd;            pageSetupDialog.ShowDialog();        }

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C#.NET频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved