???? ID: 812425 - ????? ???????: 05 ?????? 2010 - ??????: 2.0

How to print the content of a RichTextBox control by using Visual C# .NET or Visual C# 2005

?????? ??????This article applies to a different operating system than the one you are using. Article content that may not be relevant to you is disabled.
?? ???? ?? Microsoft Visual Basic .NET ??????? ?? ???, ?????811401  (http://support.microsoft.com/kb/811401/EN-US/ ) .

?? ????? ??

??? ?? ??????? ???? | ??? ?? ??????? ????

??????

This step-by-step article describes how to print the content of aRichTextBox???????? ??? TheRichTextBoxcontrol does not provide any method to print the content of the RichTextBox. You can extend theRichTextBox???? EM_FORMATRANGE ????? ?? ??????? ????? ??? ????? ???? ?? ??? ???RichTextBox??????? ???? ?????? ?????? ?? ????????? ?????

RichTextBoxPrintCtrl ???????? ?????

????? ????? ?? ??????? ???? ?? ??? ???? ?? ????? ???? ??RichTextBox???? ?? ?? ??????? ??????? ???? ?? ??? EM_FORMATRANGE ?? ????? ???? ????RichTextBox???????? ???
  1. ????? C# .NET ?? Visual C# 2005, ??? ?? ?? ????? ????????? ????????? ?? ????? ??? RichTextBoxPrintCtrl ?????? ???????? ??? ??, Class1.cs ?? ???? ???
  2. RichTextBoxPrintCtrl.cs ???? ?? ??? Class1.cs ?? ??? ??????
  3. ?????? Explorer ???, ???? ????????????? ????-????? ????, ?? ???? ????????? ??????.
  4. ??????????? ??????????? ????? ???, ???-????? ????System.Drawing.dll, ??System.Windows.Forms.dll?? ????-????? ????, ?? ???? ???OK.
  5. ?????? ??? RichTextBoxPrintCtrl.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. ??? ?? Windows ????????? ?? ????? ??? ????? C# .NET ?? Visual C# 2005, ?????????? ???????? ??? ??, Form1.cs ?? ???? ???

    ???:??? Visual Studio 2005 ??? ????????? ???? ?? ???? ???? ?????? ?? ?? ?? Windows ??????? ????????? ????? ???, ????? C# ????? ??????? ?? ?? ????????? ?? ??? ???????? ??? ??? ?? ?????? ?? Form1 ??? ???? ??? ??.. ??????? ?? ???????????? ???? ???? ?? ??????? ??? Form1.cs ?? Form1.designer.cs ??? ???? Form1.cs ??? ???? ??? ?????? Designer.cs ????? ?? ????? ?? ???? Windows ?????? ???????? ??? ????? ?? ?? ?? ??? ???????? ?? ???? ???? ?? ??????? ???? ???????? ???? ?? ???? ??.. ????? C# 2005 ??? Windows ??????? ??????? ?? ???? ??? ???? ??????? ?? ??? ????? Microsoft ??? ???? ?? ????:
    HTTP://msdn2.Microsoft.com/en-us/library/ms173077.aspx (http://msdn2.microsoft.com/en-us/library/ms173077.aspx)
  2. ?????? ???????Form1 ?? ??? ???????? ????? ????? ?? ????? ????????? ??????????? ?? ??? ???btnPageSetup, ????????? ?? ??? ???????? ?????.
  3. ????? ??? ?????????Form1 ?? ??? ???????? ????? ????? ?? ????? ????????? ??????????? ?? ??? ???btnPrintPreview, ????????? ?? ??? ?????????????? ??????? ????.
  4. ????? ??? ?????????Form1 ?? ??? ???????? ????? ????? ?? ????? ????????? ??????????? ?? ??? ???btnPrint, ????????? ?? ??? ?????????? ????.
  5. ????? ??? ??? ????? ????PrintDialog,PrintPreviewDialog,PrintDocument, ??PageSetupDialogForm1 ?? ??? ?? ?????????? ?? ???????
  6. ??????? ?????????????? ???PrintDialog1,PrintPreviewDialog1, ??PageSetupDialog1???? ?? ??? ????????PrintDocument1.
  7. ????? ????????????? ??,???????? ???? ????? ?????.
  8. ????? ????.NET ????? ?????? ??,???????, ?? ??? ???? ?? ??? ????? ????RichTextBoxPrintCtrl.dll?? ????-????? ????, ?? ???? ???OK.
  9. ??????RichTextBoxPrintCtrl?? Form1 ?? ??? ??????
  10. ?????? Explorer ???, ???? ?????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 ?? ??????? ?? ?????? ?????

??????

???????? ??????? ?? ???, Microsoft .NET Framework SDK ????????? ??? ????? ???? ?????:
RichTextBox ????
(vs.71) http://msdn2.Microsoft.com/en-us/library/SYSTEM.Windows.forms.richtextbox .aspx (http://msdn2.microsoft.com/en-us/library/system.windows.forms.richtextbox(vs.71).aspx)


???? ???? ???? ??:
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# 2005 Express Edition
??????: 
kbprint kbwindowsforms kbinheritance kbctrl kbcontrol kbhowtomaster kbhowto kbmt KB812425 KbMthi
???? ?????? ???????????? ?????? ????????
??????????: ?? ???? ?? ???? ??????? ?? ????? ?? Microsoft ????-?????? ?????????? ?????? ?????? ???? ??? ??. Microsoft ???? ??? ????-???????? ?? ????-???????? ????? ?????? ?? ???? ???????? ???? ?? ???? ????? ????? ??? ?? ??? ?????? ?? ???? ???? ???? ??? ????? ??. ???????, ????-???????? ???? ????? ???? ???? ???? ???. ?????, ????????, ?????-???? ?? ??????? ?? ???????? ?? ???? ???, ???? ?? ??? ?????? ???? ???? ??? ????? ??? ?? ???? ??. Microsoft ??????? ??? ???? ?? ?????? ?? ??????????, ????????? ?? ??? ?????? ?? ???? ????? ?? ???? ???????? ?? ??? ???? ????? ?? ??? ????????? ???? ??. Microsoft ????-?????? ?????????? ?? ????? ?????? ?? ?? ??? ??.
?????????? ?? ??????? ????????? ??????? ??:812425  (http://support.microsoft.com/kb/812425/en-us/ )