概要

本分步指南介绍了如何打印 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 中的现有代码替换为以下代码:
    using System;
    using System.Windows.Forms;
    using System.Drawing;
    using System.Runtime.InteropServices;
    using System.Drawing.Printing; namespace RichTextBoxPrintCtrl
    {
    public class RichTextBoxPrintCtrl:RichTextBox
    {
    //Convert the unit used by the .NET framework (1/100 inch)
    //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 int Print( 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(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();
    } }
    }
  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 方法中:
    		this.printDocument1.BeginPrint += new System.Drawing.Printing.PrintEventHandler(this.printDocument1_BeginPrint);
    this.printDocument1.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.printDocument1_PrintPage);
    this.btnPrint.Click += new System.EventHandler(this.btnPrint_Click);
    this.btnPrintPreview.Click += new System.EventHandler(this.btnPrintPreview_Click);
    this.btnPageSetup.Click += new System.EventHandler(this.btnPageSetup_Click);
  12. 将下面的代码添加到 Form1 类:
    		private int checkPrint;
    private void btnPageSetup_Click(object sender, System.EventArgs e)
    {
    pageSetupDialog1.ShowDialog();
    } private void btnPrintPreview_Click(object sender, System.EventArgs e)
    {
    printPreviewDialog1.ShowDialog();
    } private void btnPrint_Click(object sender, System.EventArgs e)
    {
    if (printDialog1.ShowDialog() == DialogResult.OK)
    printDocument1.Print();
    } 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); // Check for more pages
    if (checkPrint < richTextBoxPrintCtrl1.TextLength)
    e.HasMorePages = true;
    else
    e.HasMorePages = false;
    }
  13. 在“调试”菜单上,单击“启动”以运行该应用程序。Form1 将显示出来。
  14. 在 RichTextBoxPrintCtrl 中键入一些文本。
  15. 单击“页面设置”以设置页面设置。
  16. 单击“打印预览”以查看页面的打印预览。
  17. 单击“打印”以打印“RichTextBoxPrintCtrl”的内容。

C#如何打印RichTextBox控件的内容的更多相关文章

  1. HOW TO:使用 Visual C# .NET 打印 RichTextBox 控件的内容

    概要 本分步指南介绍了如何打印 RichTextBox 控件的内容.RichTextBox 控件没有提供任何打印 RichTextBox 内容的方法.您可以扩展 RichTextBox 类以使用 EM ...

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

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

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

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

  4. (C#)RichTextBox控件

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

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

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

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

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

  7. RichTextBox控件日常使用集合

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

  8. 在RichTextBox控件中显示RTF格式文件

    实现效果: 知识运用:    RichTextBox控件的LoadFile方法 //将文件内容加载到RichTextBox控件中 public void LoadFile(string path,Ri ...

  9. 在RichTextBox控件中添加超链接文本

    实现效果: 知识运用: RichTextBox控件的AppendText方法 public void AppendText{string textData} //向控件中添加文本内容 和Process ...

随机推荐

  1. 【转载】浏览器加载和渲染html的顺序

    1.浏览器加载和渲染html的顺序 1.IE下载的顺序是从上到下,渲染的顺序也是从上到下,下载和渲染是同时进行的.2.在渲染到页面的某一部分时,其上面的所有部分都已经下载完成(并不是说所有相关联的元素 ...

  2. Stage3D&Away3D整理ppt

    资料下载地址:http://files.cnblogs.com/xignzou/away3D%E6%A1%86%E6%9E%B6%E5%AD%A6%E4%B9%A0%E5%88%86%E4%BA%AB ...

  3. nyoj304 节能

    节能 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 Dr.Kong设计的机器人卡多越来越聪明.最近市政公司交给卡多一项任务,每天早晨5:00开始,它负责关掉ZK大道右侧 ...

  4. Pycharm上python unittest不执行"if __name__ == '__main__' "问题or选择非unittest run

    转:http://www.cnblogs.com/csjd/p/6366535.html python unittest不执行"if __name__ == '__main__' " ...

  5. C++ Primer(第五版)读书笔记 & 习题解答 --- Chapter 3

    Chapter 3.1 1. using声明具有如下的形式: using namespace::name; Chapter 3.2 1. C++标准一方面对库类型所提供的操作做了规定,另一方面也对库的 ...

  6. ubuntu 12.10 apt-get 源

    更改apt-get源配置文件/etc/apt/sources.list 用一下内容替换掉 deb http://mirrors.163.com/ubuntu/ precise main restric ...

  7. 程序的记事本--log4net

    你是否在遇到程序执行问题时常常百度?你是否在遇到执行错误时常常去询问别人?假设有那么是时候改变啦,对于一个Developer来说那是不专业的表现,专业的Developer都会首先查看程序的执行日志.先 ...

  8. Mybatis+MSSql插入数据的同时并获取自增的ID

    在项目中遇到这样的情况,新增一个角色,这个角色有某些权限,这两个数据存在不同的表中,一个是sys_role,另外一个是sys_role_permission表,注意,现在的逻辑是这样的 1,在表sys ...

  9. (转载)将一段符合XML格式规范字符串插入已有XML文档当中

    想我们已经存在一个XML文档,结构如下:   < xmlversion="1.0"encoding="utf-8">< employees&g ...

  10. hdu 3715(二分+2-sat)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3715 思路:二分深度,2-sat判断可行性,根据矛盾关系建图:设a=0,a'=1,b=0,b'=1;如 ...