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、想要打印表格的时候怎么弄?
C# winfrom打印技术初探的更多相关文章
- 3D打印技术在医疗上的实际应用与实验室研究
2018-01-17 Chris 免费3D打印模型资源站 预计阅读时间:5-10分钟 关键字:3D打印髋关节.脊柱置换产品,3D打印技术辅助精准截骨,义齿,生物墨水(BioInk),干细胞 随着& ...
- 3D打印技术之切片引擎(5)
[此系列文章基于熔融沉积( fused depostion modeling, FDM )成形工艺] 从这一篇文章開始,就開始说填充.在3D打印切片技术中,填充算法是最核心的部分.3D打印技术的经常使 ...
- VB 共享软件防破解设计技术初探(三)
×××××××××××××××××××××××××××××××××××××××××××××× 其他文章快速链接: VB 共享软件防破解设计技术初探(一)http://bbs.pediy.com/sho ...
- VB 共享软件防破解设计技术初探(二)
VB 共享软件防破解设计技术初探(二) ×××××××××××××××××××××××××××××××××××××××××××××× 其他文章快速链接: VB 共享软件防破解设计技术初探(一)http ...
- VB 共享软件防破解设计技术初探(一)
VB 共享软件防破解设计技术初探(一) ×××××××××××××××××××××××××××××××××××××××××××××× 其他文章快速链接: VB 共享软件防破解设计技术初探(二)http ...
- Android 插件技术:动态加载dex技术初探
1.Android动态加载dex技术初探 http://blog.csdn.net/u013478336/article/details/50734108 Android使用Dalvik虚拟机加载可执 ...
- afl-fuzz技术初探
afl-fuzz技术初探 转载请注明出处:http://www.cnblogs.com/WangAoBo/p/8280352.html 参考了: http://pwn4.fun/2017/09/21/ ...
- 3D打印技术的火爆,真的会让传统模具行业没落吗?
当一种新生事物出现时,人们除了赞美它带来的新畅想外,往往还会对"旧事物"贬低几分--各种淘汰观点总是不绝于耳.但可惜的是,新生事物取代旧事物的事儿并不会必然发生.比如,直到现在广播 ...
- 【VC++技术杂谈003】打印技术之打印机状态监控
在上一篇博文中我主要介绍了如何获取以及设置系统的默认打印机,本文将介绍如何对打印机状态进行实时监控,记录下所打印的文档.打印的份数以及打印时间等打印信息. 1.打印机虚脱机技术 在正式介绍如何对打印机 ...
随机推荐
- Android 导入 aar 库文件
1. 在需要导入 aar 的 module 目录下创建一个名叫 "aars" 的目录,并把 aar 文件复制到这里. 2. 在项目的 build.gradle 文件里添加 allp ...
- 将tomcat添加到服务中
转载自:http://blog.csdn.net/zjd934784273/article/details/47701011(windows) :http://www.cnblogs.com/ilah ...
- FFmpeg软硬解和多线程解码
一. AVCodecContext解码上下文 1.avcodec_register_all() : 注册所有的解码器 2.AVCodec *avcodec_find_decoder(enum AVCo ...
- LOJ#3088. 「GXOI / GZOI2019」旧词(树剖+线段树)
题面 传送门 题解 先考虑\(k=1\)的情况,我们可以离线处理,从小到大对于每一个\(i\),令\(1\)到\(i\)的路径上每个节点权值增加\(1\),然后对于所有\(x=i\)的询问查一下\(y ...
- jzoj5996
我們可以枚舉每一個串的最短回文後綴,這樣一定不會算重. 雖然一個字符串可能會有多個回文後綴,但是答案只會在最短的後綴被計算 記f[i]表示長度為i回文串中,沒有長度>1的回文後綴的個數,將總個數 ...
- 用0x077CB531计算末尾0的个数
http://www.matrix67.com/blog/archives/3985 unsigned int v; // find the number of trailing zeros in ...
- ionic的基础学习(第一篇)
1.ioinc的头部与底部 1.Header 固定在屏幕的顶端的组件,可包含标题,左右的功能按钮.(提供很多颜色的样式,及调用不同的样式名,亦可自定义) bar-light,bar-stable,ba ...
- jdbc连接1(可以注入)
package demo3class; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepa ...
- php7 引用成为一种类型
<?php $a= ref_count= $b=$a; is_ref= ref_count= $c=&$a; is_ref= ref_count 即a c 共用一个zval, b单独用一 ...
- 添加或删除 HTML dom元素
添加或删除 HTML dom元素 创建新的 HTML 元素 如需向 HTML DOM 添加新元素,您必须首先创建该元素(元素节点),然后向一个已存在的元素追加该元素. <div id=" ...