天天看点

C# 基础打印功能的实现1 基本代码2 打印预览3 打印机设置4 页面设置

目录

1 基本代码

2 打印预览

3 打印机设置

4 页面设置

1 基本代码

using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Printing;

namespace Test
{
    class PrintTest
    {
        //声明
        /// <summary>【缓存变量】打印文档</summary>
        private System.Drawing.Printing.PrintDocument printDocument;

        /// <summary>【缓存变量】打印的内容,</summary>
        List<string>  InfoList = new List<string> ();
        /// <summary>【缓存变量】总页数</summary>
        int TotalPages = 0;
        /// <summary>【缓存变量】当前页</summary>
        int CurrentPage = 0;
        /// <summary>【缓存变量】每页行数</summary>
        const int LinesPerPage = 10;

        PrintTest()
        {
            //添加到初始化过程内
            this.printDocument.PrintPage += new PrintPageEventHandler(this.printDocument_PrintPage);
        }


        /// <summary>
        /// 【函数】准备打印
        /// </summary>
        /// <returns></returns>
        private bool ReadyForPrint()
        {
            InfoList.Clear();
            //从Textbox中读取行,这是使用Textbox的分行功能,实际使用中不可取,可自行替换
            foreach (string line in this.textBox1.Lines)
            {
                InfoList.Add(line);
            }

            int Count = InfoList.Count;
            if (Count > 0)
            {
                TotalPages = Count / LinesPerPage;
                if (Count % LinesPerPage != 0)
                {
                    TotalPages++;
                }
                CurrentPage = 1;
                return true;
            }
            else
            {
                return false;
            }
        }

        private void Print()
        {
            if (ReadyForPrint())
            {
                this.printDocument.Print();
            }
        }

        //将打印内容画在每一页上,注意这是所有页一起画,要在画的时候分页
        private void printDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            if (CurrentPage <= TotalPages)
            {
                Graphics g = e.Graphics;
                Font drawFont = new Font("Arial", 12);
                SolidBrush drawBrush = new SolidBrush(Color.Black);

                for (int i = 0; i < LinesPerPage; i++)
                {
                    int line = (CurrentPage - 1) * LinesPerPage + i;
                    if (line > InfoList.Count - 1) { break; }

                    string str = (string)InfoList[line];
                    int x = 100;
                    int y = 200 + 50 * i;

                    g.DrawString(str, drawFont, drawBrush, x, y);
                }

                CurrentPage++;
                if (CurrentPage <= TotalPages)
                {
                    e.HasMorePages = true;
                }
                else
                {
                    e.HasMorePages = false;
                }
            }
        }
    }
}
           

当调用this.printDocument.Print();时,打印进程开始执行printDocument_PrintPage的内容。当该函数退出时如果e.HasMorePages为true,则打印进程会再次调用printDocument_PrintPage,打印进程不会知道打印总页数和当前打印页,这需要用户自己组织。

2 打印预览

private void PreView()
{
    if (ReadyForPrint())
    {
        PrintPreviewDialog printPreviewDialog = new PrintPreviewDialog();
        printPreviewDialog.Document = printDocument;
        try
        {
            printPreviewDialog.ShowDialog();
        }
        catch (Exception excep)
        {
            MessageBox.Show(excep.Message, "打印出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}
           

打印预览进程同样会调用printDocument_PrintPage,所以必须运行 ReadyForPrint()以便printDocument_PrintPage能正确执行。

3 打印机设置

private void SetPrinter()
{
    PrintDialog printDialog = new PrintDialog();
    printDialog.Document = printDocument;
    printDialog.ShowDialog();
}
           

4 页面设置

private void SetPage()
{
    PageSetupDialog pageSetupDialog = new PageSetupDialog();
    pageSetupDialog.Document = printDocument;
    pageSetupDialog.ShowDialog();
}