前言
本文是利用PrintDocument定制打印单据的小例子,仅供学习分享使用,如果不足之处,还请指正。
涉及知识点:
PrintDocument :从 Windows 窗体应用程序打印时,定义一种可重用的可发送到打印机上的对象。
PrintPreviewControl :表示 Windows 窗体应用程序打印预览的原始预览部分,没有任何对话框或按钮。
Graphics :GDI+绘图对象
PrinterSettings:设置打印机属性,如:设置属性Copies,可以设置打印份数,默认为1,
PageSettings:指定应用于单页打印的设置
DefaultPageSettings:PrintDocument的属性
PrintPage事件:PrintDocument的事件,通过此事件来绘制需要打印的内容
PaperSize:指定纸张大小
毫米和英寸的换算:打印机是以英寸为单位的,单据设置是以毫米为单位的,所以需要转换
效果图如下:
核心代码
关键代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Printing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DemoPrint
{
public partial class MainForm : Form
{
private int width_p = 200;//单位是mm
private int height_p = 70;//单位是mm
private int margin_lr = 2;//左右边距
private int margin_tb = 2;//上下边距
///
/// 需要打印的内容
///
public List PrintInfos { get; set; }
private PrintHelper printHelper = new PrintHelper();
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e)
{
InitInfo();
InitDocument();
}
private void InitInfo() {
PrinterSettings printSetting = new PrinterSettings();
printSetting.PrintRange = PrintRange.AllPages;
int width_in = MM2Inch(width_p);
int height_in = MM2Inch(height_p);
PageSettings pageSetting = new PageSettings(printSetting);
pageSetting.PaperSize = new PaperSize("customer",width_in, height_in);
int margin_lr_in = MM2Inch(margin_lr);
int margin_tb_in = MM2Inch(margin_tb);
pageSetting.Margins = new Margins(margin_lr_in, margin_lr_in, margin_tb_in, margin_tb_in);
this.pdControl.DefaultPageSettings = pageSetting;
}
private void InitDocument() {
List lstPrintInfos = new List();
PrintInfo p0 = new PrintInfo()
{
PrtType = PrintType.Table,
PrtColor = Color.Brown,
Row = int.Parse(this.txtRow.Text.Trim()),
Column = int.Parse(this.txtColumn.Text.Trim()),
Start = new Point(int.Parse(this.txtStart.Text.Trim(new char[] { '(', ')' }).Split(',')[0]), int.Parse(this.txtStart.Text.Trim(new char[] { '(', ')' }).Split(',')[1])),
End = new Point(int.Parse(this.txtEnd.Text.Trim(new char[] { '(', ')' }).Split(',')[0]), int.Parse(this.txtEnd.Text.Trim(new char[] { '(', ')' }).Split(',')[1]))
};
lstPrintInfos.Add(p0);
printHelper.PrintInfos = lstPrintInfos;
}
///
/// 转换毫米到百分之一英寸
///
///
///
private int MM2Inch(int mm) {
return (int)(mm * 100.0f / 25.4f);
}
///
/// 打印开始事件
///
///
///
private void pdControl_BeginPrint(object sender, PrintEventArgs e)
{
}
///
/// 打印事件
///
///
///
private void pdControl_PrintPage(object sender, PrintPageEventArgs e)
{
Font font = new Font("Arial", 14f, FontStyle.Regular);
Graphics g = e.Graphics;
g.PageScale = 1;
g.PageUnit = GraphicsUnit.Millimeter;
//先画一个矩形
Pen lineColor = new Pen(Color.Black, 0.2f);
g.FillRectangle(Brushes.Linen,0,0,width_p,height_p);
printHelper.Print(g);
}
///
/// 打印结束事件
///
///
///
private void pdControl_EndPrint(object sender, PrintEventArgs e)
{
}
///
/// 打印
///
///
///
private void btnPrint_Click(object sender, EventArgs e)
{
//打印对话框
if (this.ptDControl.ShowDialog() == DialogResult.OK)
{
this.pdControl.Print();
}
}
private void lblColor_Click(object sender, EventArgs e)
{
ColorDialog f = new ColorDialog();
if (f.ShowDialog() == DialogResult.OK)
{
this.lblColor.BackColor = f.Color;
}
}
///
/// 刷新
///
///
///
private void btnRefresh_Click(object sender, EventArgs e)
{
List lstPrintInfos = new List();
//表格配置
PrintInfo p0 = new PrintInfo()
{
PrtType = PrintType.Table,
PrtColor = Color.Brown,
Row = int.Parse(this.txtRow.Text.Trim()),
Column = int.Parse(this.txtColumn.Text.Trim()),
Start = new Point(int.Parse(this.txtStart.Text.Trim(new char[] { '(', ')' }).Split(',')[0]), int.Parse(this.txtStart.Text.Trim(new char[] { '(', ')' }).Split(',')[1])),
End = new Point(int.Parse(this.txtEnd.Text.Trim(new char[] { '(', ')' }).Split(',')[0]), int.Parse(this.txtEnd.Text.Trim(new char[] { '(', ')' }).Split(',')[1]))
};
lstPrintInfos.Add(p0);
//标题配置
PrintInfo p1 = new PrintInfo()
{
PrtType = PrintType.Text,
PrtColor = this.lblColor.BackColor,
Content = this.txtTitle.Text.Trim(),
Size = int.Parse(this.txtSize.Text.Trim()),
FontStyle = chkBold.Checked ? FontStyle.Bold : FontStyle.Regular,
Start = new Point(int.Parse(this.txtLocation.Text.Trim(new char[] { '(', ')' }).Split(',')[0]), int.Parse(this.txtLocation.Text.Trim(new char[] { '(', ')' }).Split(',')[1]))
};
lstPrintInfos.Add(p1);
//内容
TextBox[] T = new TextBox[12] { T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12 };
TextBox[] L = new TextBox[12] { L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12 };
for (int i = 0; i < 12; i++)
{
PrintInfo p = new PrintInfo()
{
PrtType = PrintType.Text,
PrtColor = Color.Black,
Content = T[i].Text.Trim(),
Size = 12,
FontStyle = FontStyle.Regular,
Start = new Point(int.Parse(L[i].Text.Trim(new char[] { '(', ')' }).Split(',')[0]), int.Parse(L[i].Text.Trim(new char[] { '(', ')' }).Split(',')[1]))
};
lstPrintInfos.Add(p);
}
//打印时间
PrintInfo p2 = new PrintInfo()
{
PrtType = PrintType.Text,
PrtColor = this.lblColor.BackColor,
Content = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
Size =11,
FontStyle =FontStyle.Regular,
Start = new Point(145,63)
};
lstPrintInfos.Add(p2);
printHelper.PrintInfos = lstPrintInfos;
this.ppVControl.InvalidatePreview();//刷新文档的预览,重新调用PrintDocument的Print方法
}
}
}
源码链接
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。