Print the RTF document in C #

Source: Internet
Author: User

Transferred from: Microsoft technical community

 

Create a richtextboxprintctrl Control

The following example describes how to scaleRichTextBoxClass and how to print with em_formatrangeRichTextBoxControl content.

1. In Visual C #. net, create a class library project named richtextboxprintctrl. By default, class1.cs is created.
2. Change the class1.cs name to richtextboxprintctrl. CS.
3. In Solution Explorer, right-click "Reference" and then click "add reference ".
4. In the Add reference dialog box, double-click system. Drawing. dll and system. Windows. Forms. dll, and then click OK ".
5. Replace the existing code in richtextboxprintctl. CS with the following code:

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. In the generate menu, click Generate solution to create richtextboxprintctrl. dll.

Back to Top

Test controls

1. Create a new windows application project in Visual C #. net. Form1.cs is created by default.
2. SetButtonDrag the control from the toolbox to form1. SetNameProperty changedBtnpagesetup, AndTextProperty changedPage settings.
3. Add anotherButtonDrag the control from the toolbox to form1. SetNameProperty changedBtnprintpreview, AndTextProperty changedPrint preview.
4. Add anotherButtonDrag the control from the toolbox to form1. SetNameProperty changedBtnprint, AndTextProperty changedPrint.
5. In the toolbox, double-click "printdialog", "printpreviewdialog", "printdocument", and "pagesetupdialog" to add these controls to form1.
6. SetPrintdialog1,Printpreviewdialog1AndPagesetupdialog1ControlDocumentModify attributePrintdocument1.
7. On the Tools menu, click custom toolbox ".
8. On the. NET Framework component tab, click browse, click to select richtextboxprintctrl. dll, and then click OK ".
9. SetRichtextboxprintctrlDrag form1 from the toolbox.
10. In Solution Explorer, right-clickForm1.csAnd then clickView code.
11. Add the following codeInitializecomponentMethod:

  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. Add the following code to the form1 class:

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. On the Debug menu, Click start to run the application. Form1 is displayed.
14. Type some text in richtextboxprintctrl.
15. Click "page settings" to set page settings.
16. Click print preview to view the print preview of the page.
17. Click print to print the richtextboxprintctrl content.

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.