C # print related knowledge points

Source: Internet
Author: User

       GDI+可以用来创建和处理图像,还可以“绘制文本”。人们通常认为,文本时打印出来的,不是绘制出来的,但是在.NET中,显示和渲染文本的技术类似于显示图形的技术:必须创建Graphics对象,然后利用该对象的方法来定位和渲染文本字符串。所以,字体(Font)是打印的基础知识,有关字体的知识请参阅MSDN  http://msdn.microsoft.com/zh-cn/library/system.drawing.font(v=vs.110).aspx 。

       System.Drawing.Printing命名空间的PrintDocument类提供了控制打印进程的方法、成员属性和事件,因此,要建立输出到打印机的程序,就首先要建立PrintDocument对象。

       PrintDocument pDocument = new PrintDocument();

然后调用PrintDocument.Print方法启动打印进程,此时触发PrintDocument类的BeginPrint和PrintPage事件,PrintPage事件处理方法包含生成输出的逻辑和语句,包括确定打印行数、输出DrawString语句、负责通知底层的打印控制器是否还有待打印的页面(设置HasMorePages属性)等。触发流程如下:

private void FrmMain_Load(object sender, EventArgs e){sr = new StreamReader(@"数据的路径(.txt)");//数据格式如下/*1000758,1050,SKJALDHAHDLKJAH,125.4701000758,1050,SKJALDHAHDLKJAH,125.4701000758,1050,SKJALDHAHDLKJAH,125.4701000758,1050,SKJALDHAHDLKJAH,125.4701000758,1050,SKJALDHAHDLKJAH,125.4701000758,1050,SKJALDHAHDLKJAH,125.4701000758,1050,SKJALDHAHDLKJAH,125.4701000758,1050,SKJALDHAHDLKJAH,125.4701000758,1050,SKJALDHAHDLKJAH,125.4701000758,1050,SKJALDHAHDLKJAH,125.470*/}
加载数据
1         StreamReader sr;2         string[] prtLine;3         Font rptFont;4         Font hdrFont;5         string title = "Title";6         float lineHeight;
类级别的变量
  private void pDocument_BeginPrint(object sender, PrintEventArgs e)        {            rptFont = new Font("Arial", 10);            hdrFont = new Font(rptFont, FontStyle.Bold);        }
BeginPrint事件,一般用于初始化字体等变量
 private void pDocument_EndPrint(object sender, PrintEventArgs e)        {           rptFont.Dispose();           hdrFont.Dispose();           sr.Close();        }
EndPrint事件,一般用于释放资源,关闭数据连接等
 private void pDocument_PrintPage(object sender, PrintPageEventArgs e)        {            Graphics graphics = e.Graphics;            int xPos = e.MarginBounds.Left;            int lineCt = 0;            lineHeight = hdrFont.GetHeight(graphics);            int linesPerPage = (int)((e.MarginBounds.Bottom - e.MarginBounds.Top) / lineHeight - 2);            float yPos = 2 * lineHeight + e.MarginBounds.Top;            int hdrPos = e.MarginBounds.Top;            PrintHdr(graphics, hdrPos, 200);            string prod;            char[] delim = { ‘,‘ };            while ((prod = sr.ReadLine()) != null)            {                prtLine = prod.Split(delim, 4);                yPos += lineHeight;                PrintDetail(graphics, yPos);                if (lineCt == linesPerPage)                {                    e.HasMorePages = true;                    lineCt = 0;                    break;                }                lineCt++;            }        }
PrintPages事件,包括主要的打印逻辑以及HasMorePages属性的设置
 private void PrintHdr(Graphics g, int yPos, int xPos)        {            g.DrawString(title, hdrFont, Brushes.Black, xPos, yPos);            float[] ts = { 80, 80, 200 };            StringFormat strFmt = new StringFormat();            strFmt.SetTabStops(0, ts);            g.DrawString("Code\tVender\tDescription\tCost", hdrFont, Brushes.Black, xPos, yPos + 2 * lineHeight, strFmt);        }
打印大标题和列标题
 private void PrintDetail(Graphics g, float yPos)        {            int xPos = 200;            StringFormat strFmt = new StringFormat();            strFmt.Trimming = StringTrimming.EllipsisCharacter;            strFmt.FormatFlags = StringFormatFlags.NoWrap;            RectangleF r = new RectangleF(xPos + 160, yPos, 200, lineHeight);            string invenid = prtLine[0];            string vendor = prtLine[1];            string desc = prtLine[2];            Decimal price = decimal.Parse(prtLine[3]);            g.DrawString(invenid, rptFont, Brushes.Black, xPos, yPos);            g.DrawString(vendor, rptFont, Brushes.Black, xPos + 80, yPos);            g.DrawString(desc, rptFont, Brushes.Black, r, strFmt);            strFmt.Alignment = StringAlignment.Far;            strFmt.Trimming = StringTrimming.None;            g.DrawString(price.ToString("#,###.00"), rptFont, Brushes.Black, xPos + 400, yPos, strFmt);        }
打印详细内容
 private void btnPrint_Click(object sender, EventArgs e)        {            PrintDocument pDocument = new PrintDocument();            PrintDialog pDialog = new PrintDialog();            pDialog.Document = pDocument;            pDialog.AllowSomePages = true;            PrintPreviewDialog preDialog = new PrintPreviewDialog();            preDialog.Document = pDocument;            pDocument.PrintPage += new PrintPageEventHandler(pDocument_PrintPage);            pDocument.BeginPrint += new PrintEventHandler(pDocument_BeginPrint);            pDocument.EndPrint += new PrintEventHandler(pDocument_EndPrint);            if (pDialog.ShowDialog() == DialogResult.OK)            {                pDocument.Print();            }        }
按钮事件

 

C#打印相关的知识点

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.