怎样使用C#的RichTextBox控件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样使用C#的RichTextBox控件相关的知识,希望对你有一定的参考价值。

用RichTextBox.Text.Insert方法将内容插入第一行。实现方法如下
(1)在Visual Studio中建立一个“Windows 窗体应用程序”项目
(2)在窗体Form1上布置一个RichTextBox,一个TextBox和一个Button

(3)窗体代码Form1.cs

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1

public partial class Form1 : Form

public Form1()

InitializeComponent();
button1.Text = "插入到第一行";


private void button1_Click(object sender, EventArgs e)

string newLine = textBox1.Text + Environment.NewLine;
// 将textBox1的内容插入到第一行
// 索引0是 richText1 第一行位置
richTextBox1.Text = richTextBox1.Text.Insert(0, newLine);




(4)运行
参考技术A 这是高级文本显示控件。它比textbox来的更高级,支持段落和格式。
Text属性(string):控件正文
ReadOnly属性(bool):控制能否读写
Clear()方法:清除所有文本
Backcolor属性(Color):背景颜色
Forecolor属性(Color):文本颜色,前景色
其它的就是不常用的属性和常规属性
这个是文本显示控件,使用超简单的,没有多高的技术含量

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

概要
本分步指南介绍了如何打印 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”的内容。
参考
有关其他信息,请参见 Microsoft .NET Framework SDK 文档中的下列主题:
RichTextBox 类
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWindowsFormsRichTextBoxClassTopic.asp

以上是关于怎样使用C#的RichTextBox控件的主要内容,如果未能解决你的问题,请参考以下文章

C#中怎样让richTextBox控件的滚动条跟随数据向下移动!

转发控件的所有属性

C# 怎样将ListView中的图片复制到richTextBox中去?

在C#中,怎么调整textbox中的文字行间距

c#中richtextbox设置行距的问题

求救,C#富文本框显示异常!