WinForm控件的简单打印方法

摘要:
由于在项目中使用了大量的用户控件,并且需要提供打印功能,我尝试了一种简单的方法来控制打印,该方法基于Microsoft的示例并略有扩展。PrintPage和DoPrint方法被声明为要在子类中重新定义的虚拟方法。毕竟,作为图片打印不是一个好方法。

由于项目中使用了大量的用户控件,需要提供打印功能,本人尝试了一种简单的控制打印的方法,基于微软的例子并稍作扩充。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Printing;

namespace PrintTest
{
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }       

        private void printDocument2_PrintPage(object sender, PrintPageEventArgs e)
        {
            DoPrint(e);           
        } 
     
        protected Bitmap memoryImage;
        protected virtual void DoPrint(PrintPageEventArgs e)
        {
            float leftMargin = e.MarginBounds.Left;
            float topMargin = e.MarginBounds.Top;
            e.Graphics.DrawImage(memoryImage, leftMargin, topMargin, e.MarginBounds.Width, e.MarginBounds.Height);
        }

        private void CaptureScreen(Control ctrl)
        {
            Size s = ctrl.Size;
            memoryImage = new Bitmap(s.Width, s.Height);
            using (Graphics memoryGraphics = Graphics.FromImage(memoryImage))
            {
                Rectangle rectClient = new Rectangle(0, 0, s.Width, s.Height);
                Rectangle rectScreen = this.RectangleToScreen(rectClient);
                memoryGraphics.CopyFromScreen(rectScreen.Left, rectScreen.Top, 0, 0, s);
            }
        }

        private void btnPrint_Click(object sender, EventArgs e)
        {
            PrintPage();
        }

        public void PrintControl(Control ctrl)
        {
            CaptureScreen(ctrl);
            printDocument2.DefaultPageSettings.Landscape = true;
            printDocument2.Print();
        }

        public virtual void PrintPage()
        {
            PrintControl(this);
        }       
    }
}
说明:
1、在自定义控件中添加了一个“打印”按钮,用于打印控件自己。
PrintPage 和DoPrint方法声明成虚拟方法是为了在子类中可以重定义,毕竟,作为图片打印不是一个好方法。
2、对于窗体自身,使用该方法有个问题,那就是窗体通常有标题栏,不同于普通的控件,因此捕捉的图片偏移一个标题栏的大小,如何解决就留给大家了,呵呵。

免责声明:文章转载自《WinForm控件的简单打印方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇django-filters跨表过滤Ubuntu16桥接模式上网并设置静态ip下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

matlab读取cvs文件的几种方法

matlab读取CVS文件的几种方法:1,实用csvread()函数csvread()函数有三种使用方法:1、M=csvread2、M=csvread3、M=csvread第一种方法中,直接输入文件名,将数据读到矩阵M中。textscan函数读取的结果会存在cell数组中。...

Centos7 挂载

1.Mount命令:Mount语法格式:Mount Mount设备文件信息Mount point(目录)注意:装载点(目录)必须有一个装载CD-ROM驱动器:Mount/dev/cdrom/mnt 2.卸载命令:umount语法格式:umountmount point(directory)3.查看磁盘装载状态/查看磁盘使用情况df4。存储设备通电时自动装载#...

mysql修改字段防止锁表

步骤1:修改大表、addcolumn或dropcolumn的字段,操作完成后将锁定该表。此时,查询ok、insert和update将等待锁定。...

页面加载时自动执行(加载)js的几种方法

Js调用onload方法window.onload=function(){func1();func2();func3();}二、JQ方法1.整个页面的document全部加载完成以后执行。不幸的这种方式不仅要求页面的DOMtree全部加载完成,而且要求所有的外部图片和资源全部加载完成。更不幸的是,如果外部资源,例如图片需要很长时间来加载,那么这个js方法执行...

2.页面绘制和引入组件库uView

文本+背景色的形式,而不是横幅图的形式,可以节省未来的工作量。在index.vue中,关于开关的代码:EFGHIJKLMNOPQRSTUWXYZB˃DEFGHIJKLNNOPQRSTUVWXYZEFGHIJKLMNOPQRSTUVWXYZ导出默认值{data(){return{}},onLoad()},方法:{}}。横幅{width:100%;height:...

一起学习Avalonia(十二)

可以使用数据模板自定义和显示数据模板模板。文档中介绍了Avalonia的基本数据模板。PublicstringFirstName{get;set;}publicstringLastName{get;set;}扩展使用文档最后介绍了扩展使用,包括2个模型。Student和Teacher。在MainWindowViewModel中创建属性Content。此属性是...