C# winfrom打印技术初探
最近用到了winform去打印,網(wǎng)上查了一些資料,大概內(nèi)容:
一 、首先有幾個(gè)類?PageSetupDialog 、 PrintDialog 、PrintDocument 、PrintPreviewControls,\PrintPreviewDialog。這幾個(gè)類的功能做簡(jiǎn)要介紹
?
PageSetupDialog 這個(gè)是打印設(shè)置對(duì)話框。
PrintDialog 、打印對(duì)話框。按確定能觸發(fā)?printDocument1_PrintPage事件,或者通過?printDocument1.Print()觸發(fā)?printDocument1_PrintPage事件。
PrintDocument 、打印的具體內(nèi)容在這個(gè)里面設(shè)置是打印資料的對(duì)象哦。需要在這個(gè)的PrintPage事件下面寫繪圖的的形狀什么的用GDI做。
PrintPreviewDialog:打印預(yù)覽對(duì)話框。
PrintPreviewControls\\這個(gè)是打印的一個(gè)預(yù)覽控件我這里沒有用到,應(yīng)該是可以實(shí)時(shí)顯示用的。
二、具體的操作步驟
1、新建winform項(xiàng)目及創(chuàng)建窗體
2、拖取 打印 相關(guān)控件
?? PageSetupDialog 、 PrintDialog 、 PrintDocument 、PrintPreviewDialog
3、設(shè)置上述控件的Document屬性為相應(yīng)的PrintDocument
4、設(shè)置按鈕等控件 及 添加相應(yīng)按鈕事件
5、示意代碼如下
三、打印代碼如下
public?partial?class?Form3?:?Form
{
????public?Form3()
????{
????????InitializeComponent();
????????this.printDocument1.OriginAtMargins?=?true;//啟用頁邊距
????????this.pageSetupDialog1.EnableMetric?=?true;?//以毫米為單位
????}
????//打印設(shè)置
????private?void?btnSetPrint_Click(object?sender,?EventArgs?e)
????{
????????this.pageSetupDialog1.ShowDialog();?
????}
????//打印預(yù)覽
????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();
????????}
????}
????//打印內(nèi)容的設(shè)置
????private?void?printDocument1_PrintPage(object?sender,?System.Drawing.Printing.PrintPageEventArgs?e)
????{????????????????????????
????????打印內(nèi)容?為?整個(gè)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);
????????打印內(nèi)容?為?局部的?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);?
????????//打印內(nèi)容?為?自定義文本內(nèi)容?
????????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、紙張大小一般是多大的,打印的時(shí)候打印內(nèi)容和紙張?jiān)趺催m應(yīng)?怎么計(jì)算打印的頁數(shù),怎么計(jì)算需要打印多少頁。
A4紙張為210*297
?
2、邊距怎么設(shè)置。
答:邊距設(shè)置,
A.NET對(duì)于頁邊距是絕對(duì)的“大國沙文主義”,只認(rèn)美制的“英寸”不認(rèn)別的制式,其默認(rèn)單位是“0.01英寸”。
而我們的OS就比較入鄉(xiāng)隨俗,知道用“毫米”。所以在PageSetupDialog窗體上中顯示的單位是“毫米”(取決于OS)。
由于兩邊制式不一樣,搭不上話,.NET就會(huì)強(qiáng)制的把OS的制式單位給轉(zhuǎn)換成它“習(xí)慣”的“英寸”。 也就是說:
在你點(diǎn)擊“頁面設(shè)置”對(duì)話框的“確定”按鈕后,.NET會(huì)自動(dòng)進(jìn)行“毫米->英寸”的隱式轉(zhuǎn)換。
B再度打開PageSetupDialog對(duì)話框時(shí),PageSetupDialog對(duì)象卻并沒有進(jìn)行與上面的隱式轉(zhuǎn)換對(duì)應(yīng)的“英寸->毫米”逆向轉(zhuǎn)換,
而僅僅是簡(jiǎn)單粗暴地將單位名改了,從“Display”(0.01英寸)改成了“TenthsOfAMillimeter”(0.1毫米),數(shù)值卻動(dòng)都沒動(dòng)一下。
也就是說不管你給PageSetupDialog什么值,它都認(rèn)為是以0.1毫米為單位的數(shù)。
?
在printDoc.DefaultPageSettings.Margins = new System.Drawing.Printing.Margins(100, 100, 50, 50); 中給出了打印邊距設(shè)置為默認(rèn)值是轉(zhuǎn)化為0.1倍的mm值,然后如果從
3、怎么打印多頁內(nèi)容。
if (nPrintedHeight < nWinHeight)
{
e.HasMorePages = true;
}
else
{
e.HasMorePages = false;
}
?
4、怎么用代碼在頁面的固定位置粘貼預(yù)定義好的圖片。當(dāng)圖片和文字重合的時(shí)候怎么把文字顯示到圖片的上面。
?
6、想要打印表格的時(shí)候怎么弄?
轉(zhuǎn)載于:https://www.cnblogs.com/ModBus/p/4983568.html
總結(jié)
以上是生活随笔為你收集整理的C# winfrom打印技术初探的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL查询本周、上周、本月、上个月份
- 下一篇: hdu1196 Lowest Bit