C# richTextBox封装的一个打印的类
2013-11-26 21:40
267 查看
using System; using System.Windows.Forms; using System.Drawing; using System.Runtime.InteropServices; using System.Drawing.Printing; #region 调用示例 /*使用 //页面设置 private void btnPageSetup_Click(object sender, EventArgs e) { richTextBoxPrintClass r = new richTextBoxPrintClass(); r.richTextBox = richTextBox1; r.ShowPageSetupDlg(); } //打印预览功能 private void btnPrintPreview_Click(object sender, EventArgs e) { richTextBoxPrintClass r = new richTextBoxPrintClass(); r.richTextBox = richTextBox1; r.ShowShowPagePriviewDlg(); } //打印 private void btnPrint_Click(object sender, EventArgs e) { richTextBoxPrintClass r = new richTextBoxPrintClass(); r.richTextBox = richTextBox1; r.ShowPrintDlg(); } */ #endregion //http://support.microsoft.com/kb/812425/zh-cn namespace WindowsFormsApplication1 { class richTextBoxPrintClass { public richTextBoxPrintClass() { InitializeComponent(); } #region 打印功用 //and the unit used by Win32 API calls (twips 1/1440 inch) private const double anInch = 14.4; [StructLayout(LayoutKind.Sequential)] private struct RECT { public int Left; public int Top; public int Right; public int Bottom; } [StructLayout(LayoutKind.Sequential)] private struct CHARRANGE { public int cpMin; //First character of range (0 for start of doc) public int cpMax; //Last character of range (-1 for end of doc) } [StructLayout(LayoutKind.Sequential)] private struct FORMATRANGE { public IntPtr hdc; //Actual DC to draw on public IntPtr hdcTarget; //Target DC for determining text formatting public RECT rc; //Region of the DC to draw to (in twips) public RECT rcPage; //Region of the whole DC (page size) (in twips) public CHARRANGE chrg; //Range of text to draw (see earlier declaration) } private const int WM_USER = 0x0400; private const int EM_FORMATRANGE = WM_USER + 57; [DllImport("USER32.dll")] private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp); // Render the contents of the RichTextBox for printing // Return the last character printed + 1 (printing start from this point for next page) public static int Print(RichTextBox richTextBox, int charFrom, int charTo, PrintPageEventArgs e) { //Calculate the area to render and print RECT rectToPrint; rectToPrint.Top = (int)(e.MarginBounds.Top * anInch); rectToPrint.Bottom = (int)(e.MarginBounds.Bottom * anInch); rectToPrint.Left = (int)(e.MarginBounds.Left * anInch); rectToPrint.Right = (int)(e.MarginBounds.Right * anInch); //Calculate the size of the page RECT rectPage; rectPage.Top = (int)(e.PageBounds.Top * anInch); rectPage.Bottom = (int)(e.PageBounds.Bottom * anInch); rectPage.Left = (int)(e.PageBounds.Left * anInch); rectPage.Right = (int)(e.PageBounds.Right * anInch); IntPtr hdc = e.Graphics.GetHdc(); FORMATRANGE fmtRange; fmtRange.chrg.cpMax = charTo; //Indicate character from to character to fmtRange.chrg.cpMin = charFrom; fmtRange.hdc = hdc; //Use the same DC for measuring and rendering fmtRange.hdcTarget = hdc; //Point at printer hDC fmtRange.rc = rectToPrint; //Indicate the area on page to print fmtRange.rcPage = rectPage; //Indicate size of page IntPtr res = IntPtr.Zero; IntPtr wparam = IntPtr.Zero; wparam = new IntPtr(1); //Get the pointer to the FORMATRANGE structure in memory IntPtr lparam = IntPtr.Zero; lparam = Marshal.AllocCoTaskMem(Marshal.SizeOf(fmtRange)); Marshal.StructureToPtr(fmtRange, lparam, false); //Send the rendered data for printing res = SendMessage(richTextBox.Handle, EM_FORMATRANGE, wparam, lparam); //Free the block of memory allocated Marshal.FreeCoTaskMem(lparam); //Release the device context handle obtained by a previous call e.Graphics.ReleaseHdc(hdc); //Return last + 1 character printer return res.ToInt32(); } #endregion #region 初始化 public RichTextBox richTextBox; private PageSetupDialog pageSetupDialog1; private PrintDialog printDialog1; private PrintDocument printDocument1; private PrintPreviewDialog printPreviewDialog1; private void InitializeComponent() { richTextBox = new RichTextBox(); pageSetupDialog1 = new PageSetupDialog(); printDialog1 = new PrintDialog(); printDocument1 = new PrintDocument(); printPreviewDialog1 = new PrintPreviewDialog(); // // pageSetupDialog1 // pageSetupDialog1.Document = printDocument1; // // printDialog1 // printDialog1.Document = printDocument1; printDialog1.UseEXDialog = true; // // printDocument1 // printDocument1.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(printDocument1_PrintPage); printDocument1.BeginPrint += new System.Drawing.Printing.PrintEventHandler(printDocument1_BeginPrint); // // printPreviewDialog1 // printPreviewDialog1.AutoScrollMargin = new System.Drawing.Size(0, 0); printPreviewDialog1.AutoScrollMinSize = new System.Drawing.Size(0, 0); printPreviewDialog1.ClientSize = new System.Drawing.Size(400, 300); printPreviewDialog1.Document = printDocument1; printPreviewDialog1.Enabled = true; // printPreviewDialog1.Icon = ((System.Drawing.Icon)(resources.GetObject("printPreviewDialog1.Icon"))); printPreviewDialog1.Name = "printPreviewDialog1"; printPreviewDialog1.Visible = false; } private int checkPrint; private void printDocument1_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e) { checkPrint = 0; } private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { // Print the content of RichTextBox. Store the last character printed. //checkPrint = richTextBoxPrintCtrl1.Print(checkPrint, richTextBoxPrintCtrl1.TextLength, e); checkPrint = richTextBoxPrintClass.Print(richTextBox, checkPrint, richTextBox.TextLength, e); // Check for more pages if (checkPrint < richTextBox.TextLength) e.HasMorePages = true; else e.HasMorePages = false; } #endregion //页面设置功能 public void ShowPageSetupDlg() { pageSetupDialog1.ShowDialog(); } //打印预览功能 public void ShowShowPagePriviewDlg() { printPreviewDialog1.ShowDialog(); } //打印 public void ShowPrintDlg() { if (printDialog1.ShowDialog() == DialogResult.OK) printDocument1.Print(); } } }
richTextBoxPrintClass
相关文章推荐
- 【Log日志】一个封装的日志打印库(显示类,方法,行数)--破晓觉醒
- 封装一个字符数组,实现增加,删除,替换,打印,搜索等功能
- 封装一个函数可以在屏幕上打印信息信息(c)语言例子
- 封装一个打印日期和行号的函数
- 【Android】封装一个简单好用的打印Log的工具类
- 封装一个简单好用的打印Log的工具类And快速开发系列 10个常用工具类
- 【Android】封装一个简单好用的打印Log的工具类
- Androd封装一个Log打印工具一键实现打印不打印
- 封装一个打印的公共类,跟童鞋们分享一下
- 找出一个二维数组的鞍点,即该位置上的元素在该行中最大,在该列中最小(也可能没鞍点),打印出有关信息。
- 【ThinkingInC++】37、更安全的union可以封装在一个类中
- bootstrapTable printThis打印插件 中 printThis.js中的一个buge
- 2013年用友校招编程题:用1、2、2、3、4、5这六个数字,用java写一个程序,打印出所有不同的排列
- 【菜鸟学Java】3:封装一个分页类PageBean
- java 封装 (用一个类去定义另一个类的属性)
- 用尽量高效的方法用”*”打印出一个空心正方形
- 柯里化函数封装一个检测数据类型的方法
- 封装为一个元素绑定事件
- JAVA--第十周实验--封装一类对象,功能是随机产生一个2000年后的年份,并输出该年2月的日历页(草稿)
- JS写一个简单的程序,输入两个整数,打印这两个数的和,差,积,余数