• C# winfrom打印技术初探


    最近用到了winform去打印,网上查了一些资料,大概内容:

    一 、首先有几个类 PageSetupDialog 、 PrintDialog 、PrintDocument 、PrintPreviewControls,PrintPreviewDialog。这几个类的功能做简要介绍

     
    PageSetupDialog 这个是打印设置对话框。

    PrintDialog 、打印对话框。按确定能触发 printDocument1_PrintPage事件,或者通过 printDocument1.Print()触发 printDocument1_PrintPage事件。
    PrintDocument 、打印的具体内容在这个里面设置是打印资料的对象哦。需要在这个的PrintPage事件下面写绘图的的形状什么的用GDI做。

    PrintPreviewDialog:打印预览对话框。

    PrintPreviewControls\这个是打印的一个预览控件我这里没有用到,应该是可以实时显示用的。

    二、具体的操作步骤

    1、新建winform项目及创建窗体

    2、拖取 打印 相关控件
       PageSetupDialog 、 PrintDialog 、 PrintDocument 、PrintPreviewDialog

    3、设置上述控件的Document属性为相应的PrintDocument

    4、设置按钮等控件 及 添加相应按钮事件

    5、示意代码如下

    三、打印代码如下

    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
            this.printDocument1.OriginAtMargins = true;//启用页边距
            this.pageSetupDialog1.EnableMetric = true; //以毫米为单位

        }

        //打印设置
        private void btnSetPrint_Click(object sender, EventArgs e)
        {
            this.pageSetupDialog1.ShowDialog(); 
        }

        //打印预览
        private void btnPrePrint_Click(object sender, EventArgs e)
        {
            this.printPreviewDialog1.ShowDialog(); 
        }

        //打印
        private void btnPrint_Click(object sender, EventArgs e)
        {
            if (this.printDialog1.ShowDialog() == DialogResult.OK)
            {
                this.printDocument1.Print();
            }
        }

        //打印内容的设置
        private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {                        
            ////打印内容 为 整个Form
            //Image myFormImage;
            //myFormImage = new Bitmap(this.Width, this.Height);
            //Graphics g = Graphics.FromImage(myFormImage);
            //g.CopyFromScreen(this.Location.X, this.Location.Y, 0, 0, this.Size);
            //e.Graphics.DrawImage(myFormImage, 0, 0);

            ////打印内容 为 局部的 this.groupBox1
            //Bitmap _NewBitmap = new Bitmap(groupBox1.Width, groupBox1.Height);
            //groupBox1.DrawToBitmap(_NewBitmap, new Rectangle(0, 0, _NewBitmap.Width, _NewBitmap.Height));
            //e.Graphics.DrawImage(_NewBitmap, 0, 0, _NewBitmap.Width, _NewBitmap.Height); 

            //打印内容 为 自定义文本内容 
            Font font = new Font("宋体", 12);
            Brush bru = Brushes.Blue; 
            for (int i = 1; i <= 5; i++)
            {
                e.Graphics.DrawString("Hello world ", font, bru, i*20, i*20);
            }
        }

    四、打印中遇到的问题

    1、纸张大小一般是多大的,打印的时候打印内容和纸张怎么适应?怎么计算打印的页数,怎么计算需要打印多少页。

    A4纸张为210*297

     

    2、边距怎么设置。

    答:边距设置,

    A.NET对于页边距是绝对的“大国沙文主义”,只认美制的“英寸”不认别的制式,其默认单位是“0.01英寸”。
    而我们的OS就比较入乡随俗,知道用“毫米”。所以在PageSetupDialog窗体上中显示的单位是“毫米”(取决于OS)。
    由于两边制式不一样,搭不上话,.NET就会强制的把OS的制式单位给转换成它“习惯”的“英寸”。 也就是说:
    在你点击“页面设置”对话框的“确定”按钮后,.NET会自动进行“毫米->英寸”的隐式转换。

    B再度打开PageSetupDialog对话框时,PageSetupDialog对象却并没有进行与上面的隐式转换对应的“英寸->毫米”逆向转换,
    而仅仅是简单粗暴地将单位名改了,从“Display”(0.01英寸)改成了“TenthsOfAMillimeter”(0.1毫米),数值却动都没动一下。
    也就是说不管你给PageSetupDialog什么值,它都认为是以0.1毫米为单位的数。

     

    在printDoc.DefaultPageSettings.Margins = new System.Drawing.Printing.Margins(100, 100, 50, 50); 中给出了打印边距设置为默认值是转化为0.1倍的mm值,然后如果从

    3、怎么打印多页内容。

    if (nPrintedHeight < nWinHeight)
    {
    e.HasMorePages = true;
    }
    else
    {
    e.HasMorePages = false;
    }

     

    4、怎么用代码在页面的固定位置粘贴预定义好的图片。当图片和文字重合的时候怎么把文字显示到图片的上面。

     

    6、想要打印表格的时候怎么弄?

  • 相关阅读:
    jquery easyui 时间控件的使用
    3101 php 学习推荐
    报到
    《C++语言的设计和演化》摘录
    怀念下以前听摇滚乐的日子
    Maven無法下載依賴時的解決方案
    RDF和Jena RDF API入门(2)
    WEB数据挖掘(五)——Aperture数据抽取(1)
    RDF和Jena RDF API入门(1)
    Ubuntu SVN安装配置十分简单
  • 原文地址:https://www.cnblogs.com/ModBus/p/4983568.html
Copyright © 2020-2023  润新知