概要

本分步指南介绍了如何打印 RichTextBox 控件的内容。RichTextBox 控件没有提供任何打印 RichTextBox 内容的方法。您可以扩展 RichTextBox 类以使用 EM_FORMATRANGE 消息将 RichTextBox 控件的内容发送到一个输出设备(如打印机)。

 

创建 RichTextBoxPrintCtrl 控件

下面的示例介绍了如何扩展 RichTextBox 类,以及如何使用 EM_FORMATRANGE 打印 RichTextBox 控件的内容。

  1. 在 Visual C# .NET 中,新建一个名为 RichTextBoxPrintCtrl 的类库项目。默认情况下创建 Class1.cs。
  2. 将 Class1.cs 的名称改为 RichTextBoxPrintCtrl.cs。
  3. 在解决方案资源管理器中,右键单击“引用”,然后单击“添加引用”。
  4. 在“添加引用”对话框中,双击“System.Drawing.dll”和“System.Windows.Forms.dll”,然后单击“确定”。
  5. 将 RichTextBoxPrintCtl.cs 中的现有代码替换为以下代码:
    1. using System;
    2. using System.Windows.Forms;
    3. using System.Drawing;
    4. using System.Runtime.InteropServices;
    5. using System.Drawing.Printing;
    6. namespace RichTextBoxPrintCtrl
    7. {
    8. public class RichTextBoxPrintCtrl:RichTextBox
    9. {
    10. //Convert the unit used by the .NET framework (1/100 inch)
    11. //and the unit used by Win32 API calls (twips 1/1440 inch)
    12. private const double anInch = 14.4;
    13. [StructLayout(LayoutKind.Sequential)]
    14. private struct RECT
    15. {
    16. public int Left;
    17. public int Top;
    18. public int Right;
    19. public int Bottom;
    20. }
    21. [StructLayout(LayoutKind.Sequential)]
    22. private struct CHARRANGE
    23. {
    24. public int cpMin; //First character of range (0 for start of doc)
    25. public int cpMax; //Last character of range (-1 for end of doc)
    26. }
    27. [StructLayout(LayoutKind.Sequential)]
    28. private struct FORMATRANGE
    29. {
    30. public IntPtr hdc; //Actual DC to draw on
    31. public IntPtr hdcTarget; //Target DC for determining text formatting
    32. public RECT rc; //Region of the DC to draw to (in twips)
    33. public RECT rcPage; //Region of the whole DC (page size) (in twips)
    34. public CHARRANGE chrg; //Range of text to draw (see earlier declaration)
    35. }
    36. private const int WM_USER = 0x0400;
    37. private const int EM_FORMATRANGE = WM_USER + 57;
    38. [DllImport("USER32.dll")]
    39. private static extern IntPtr SendMessage (IntPtr hWnd , int msg , IntPtr wp, IntPtr lp);
    40. // Render the contents of the RichTextBox for printing
    41. // Return the last character printed + 1 (printing start from this point for next page)
    42. public int Print( int charFrom, int charTo,PrintPageEventArgs e)
    43. {
    44. //Calculate the area to render and print
    45. RECT rectToPrint;
    46. rectToPrint.Top = (int)(e.MarginBounds.Top * anInch);
    47. rectToPrint.Bottom = (int)(e.MarginBounds.Bottom * anInch);
    48. rectToPrint.Left = (int)(e.MarginBounds.Left * anInch);
    49. rectToPrint.Right = (int)(e.MarginBounds.Right * anInch);
    50. //Calculate the size of the page
    51. RECT rectPage;
    52. rectPage.Top = (int)(e.PageBounds.Top * anInch);
    53. rectPage.Bottom = (int)(e.PageBounds.Bottom * anInch);
    54. rectPage.Left = (int)(e.PageBounds.Left * anInch);
    55. rectPage.Right = (int)(e.PageBounds.Right * anInch);
    56. IntPtr hdc = e.Graphics.GetHdc();
    57. FORMATRANGE fmtRange;
    58. fmtRange.chrg.cpMax = charTo; //Indicate character from to character to
    59. fmtRange.chrg.cpMin = charFrom;
    60. fmtRange.hdc = hdc; //Use the same DC for measuring and rendering
    61. fmtRange.hdcTarget = hdc; //Point at printer hDC
    62. fmtRange.rc = rectToPrint; //Indicate the area on page to print
    63. fmtRange.rcPage = rectPage; //Indicate size of page
    64. IntPtr res = IntPtr.Zero;
    65. IntPtr wparam = IntPtr.Zero;
    66. wparam = new IntPtr(1);
    67. //Get the pointer to the FORMATRANGE structure in memory
    68. IntPtr lparam= IntPtr.Zero;
    69. lparam = Marshal.AllocCoTaskMem(Marshal.SizeOf(fmtRange));
    70. Marshal.StructureToPtr(fmtRange, lparam, false);
    71. //Send the rendered data for printing
    72. res = SendMessage(Handle, EM_FORMATRANGE, wparam, lparam);
    73. //Free the block of memory allocated
    74. Marshal.FreeCoTaskMem(lparam);
    75. //Release the device context handle obtained by a previous call
    76. e.Graphics.ReleaseHdc(hdc);
    77. //Return last + 1 character printer
    78. return res.ToInt32();
    79. }
    80. }
    81. }
  6. 在“生成”菜单中,单击“生成解决方案”以创建 RichTextBoxPrintCtrl.dll。
 

测试控件

  1. 在 Visual C# .NET 中创建一个新的 Windows 应用程序项目。默认情况下将创建出 Form1.cs。
  2. 将一个按钮控件从工具箱拖入 Form1。将 Name 属性更改为 btnPageSetup,并将 Text 属性更改为页面设置。
  3. 将另一个按钮控件从工具箱拖入 Form1。将 Name 属性更改为 btnPrintPreview,并将 Text 属性更改为打印预览。
  4. 将另一个按钮控件从工具箱拖入 Form1。将 Name 属性更改为 btnPrint,并将 Text 属性更改为打印。
  5. 在工具箱中,双击“PrintDialog”、“PrintPreviewDialog”、“PrintDocument”和“PageSetupDialog”以将这些控件添加到 Form1 中。
  6. 将 PrintDialog1、PrintPreviewDialog1 和 PageSetupDialog1 控件的 Document 属性修改为 PrintDocument1。
  7. 在“工具”菜单上,单击“自定义工具箱”。
  8. 在“.NET Framework 组件”选项卡上,单击“浏览”,单击以选中“RichTextBoxPrintCtrl.dll”,然后单击“确定”。
  9. 将 RichTextBoxPrintCtrl 从工具箱拖入 Form1。
  10. 在解决方案资源管理器中,右键单击 Form1.cs,然后单击查看代码。
  11. 将以下代码添加到 InitializeComponent 方法中:
    1. this.printDocument1.BeginPrint += new System.Drawing.Printing.PrintEventHandler(this.printDocument1_BeginPrint);
    2. this.printDocument1.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.printDocument1_PrintPage);
    3. this.btnPrint.Click += new System.EventHandler(this.btnPrint_Click);
    4. this.btnPrintPreview.Click += new System.EventHandler(this.btnPrintPreview_Click);
    5. this.btnPageSetup.Click += new System.EventHandler(this.btnPageSetup_Click);
  12. 将下面的代码添加到 Form1 类:
    1. private int checkPrint;
    2. private void btnPageSetup_Click(object sender, System.EventArgs e)
    3. {
    4. pageSetupDialog1.ShowDialog();
    5. }
    6. private void btnPrintPreview_Click(object sender, System.EventArgs e)
    7. {
    8. printPreviewDialog1.ShowDialog();
    9. }
    10. private void btnPrint_Click(object sender, System.EventArgs e)
    11. {
    12. if (printDialog1.ShowDialog() == DialogResult.OK)
    13. printDocument1.Print();
    14. }
    15. private void printDocument1_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
    16. {
    17. checkPrint = 0;
    18. }
    19. private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
    20. {
    21. // Print the content of RichTextBox. Store the last character printed.
    22. checkPrint = richTextBoxPrintCtrl1.Print(checkPrint, richTextBoxPrintCtrl1.TextLength, e);
    23. // Check for more pages
    24. if (checkPrint < richTextBoxPrintCtrl1.TextLength)
    25. e.HasMorePages = true;
    26. else
    27. e.HasMorePages = false;
    28. }
  13. 在“调试”菜单上,单击“启动”以运行该应用程序。Form1 将显示出来。
  14. 在 RichTextBoxPrintCtrl 中键入一些文本。
  15. 单击“页面设置”以设置页面设置。
  16. 单击“打印预览”以查看页面的打印预览。
  17. 单击“打印”以打印“RichTextBoxPrintCtrl”的内容。
参考

有关其他信息,请参见 Microsoft .NET Framework SDK 文档中的下列主题:
RichTextBox 类
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWindowsFormsRichTextBoxClassTopic.asp

HOW TO:使用 Visual C# .NET 打印 RichTextBox 控件的内容的更多相关文章

  1. C#如何打印RichTextBox控件的内容

      本任务的内容 摘要 创建 RichTextBoxPrintCtrl 控件 测试控件 参考 概要 本分步指南介绍了如何打印 RichTextBox 控件的内容.RichTextBox 控件没有提供任 ...

  2. window.print实现打印特定控件或内容

    window.print打印指定div 首先我们可以把要打印的内容放在div中,然后用下面的代码进行打印. <html> <head> <script language= ...

  3. (C#)RichTextBox控件

    RichTextBox(有格式文本)控件可实现TextBox控件的所有功能. ❶在RichTextBox控件中显示滚动条 RichTextBox可设置Multiline属性来控制是否显示滚动套,tru ...

  4. Visual Basic 2012 借助DataGridView控件将SQL server2012 数据导入到Excel 2010

    摘  要: SQL Server 2012 数据和Excel 2010之间的连接和数据的传输,本篇文章主要针对的是SQL Server 2012 数据导入到Excel 2010文件中.Excel软件对 ...

  5. NET RichTextBox控件如何可以插入图像

    本文介绍.NET RichTextBox控件如何可以插入图像,控制和ActiveX对象通过使用OLE方式,如在解释,.不幸的是,它涵盖了只用一个C源代码样本,所以我需要在托管代码(C#)实施类似的解决 ...

  6. RichTextBox控件-主要用于输入输出编辑文本信息

    1.在RichTextBox控件中添加超链接文字 private void btn_Add_Click(object sender, EventArgs e) { rtbox_HyperLink.Ap ...

  7. 在RichTextBox控件中插入图片

    . 在RichTextBox控件中插入图片 关键点 . 实现过程 .   public void ShowInsertImageDlg() {     OpenFileDialog OpenFileD ...

  8. 在RichTextBox控件中添加图片和文字

    public void SetText(RichTextBox rtb) { rtb.Text = "在RichTextBox控件中添加图片和文字" + Environment.N ...

  9. RichTextBox控件日常使用集合

    1.RichTextBox控件自动滚动到底部 richTextBox1.ScrollToCaret(); //将控件的内容滚动到当前光标位置

随机推荐

  1. 创建简单的Telnet实例

    step1.先加入库SuperSocket.Common.dll, SuperSocket.SocketBase.dll, SuperSocket.SocketEngine.dll,log4net.d ...

  2. Web应用中的普通java程序获取资源文件

  3. LoadRunner设置检查点的几种方法介绍

    前段时间在群里跟大家讨论一个关于性能测试的 问题,谈到如何评估测试结果,有一个朋友谈到规范问题,让我颇有感触,他说他们公司每次执行压力测试的时候,都要求脚本中必须有检查点存在,不然测试结果 将不被认可 ...

  4. supervisor介绍与安装

    前言 今天同事让我帮忙安装一个叫supervisor的软件,但自己确实没接触过这个软件 自己做一下学习的记录 我首先是查询了一下supervisor的官网,初步认识一下这个软件 Supervisor是 ...

  5. Excel提示“此工作簿包含一个或多个无法更新的链接”怎么办

    有时打开Excel文件时会弹出一个“此工作簿包含一个或多个无法更新的链接”的提示.对于初次接触这个提示的用户,可能会感到迷惑,不知道应该如何处理,这里以Excel2007为例,介绍一下这个提示出现的原 ...

  6. 《java设计模式》之责任链模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  7. Remote 'attachhome' failed on nodes:XXX

    RAC安装过程中,在安装GI的时候报如下错误: 解决方法: 根据提示执行以下脚本 $ /u01/app//grid/oui/bin/runInstaller -attachHome -noCluste ...

  8. Android: ListView数据的分批加载 以及 Handle 总结

    这是效果图: activity_main.xml 01 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/ ...

  9. Scanner类nextInt方法的使用注意点

    一.先看一段正常的代码 1. 一段用Scanner捕获键盘输入的代码: Scanner sc = new Scanner(System.in); // 先读取键盘输入的字符串 System.out.p ...

  10. tomcat支持https的历程

    tomcat真是业界良心啊,文档写的详细无比. 一.https是什么? 简单的说,就是http+SSL/TLS 协议还是http,但是在传输层过程中使用了加密(涉及握手.秘钥分发.加密.解密等过程). ...