可用RichTextBox控件读取rtf

可用RichTextBox控件读取rtf:

     rtf 模版格式($:Text为内容):

 

public const String DefaultRtfTemplate =

@"{/rtf1/ansi/ansicpg936/deff0/deflang1033/deflangfe2052{/fonttbl{/f0/fnil/fcharset134  /'cb/'ce/'cc/'e5;}}"+

@"/viewkind4/uc1/pard/lang2052/f0/fs18$:Text}";

 

public static String GetDefaultRtf(String content)
{
        return  DefaultRtfTemplate.Replace("$:Text",content);

}

 

public static String GetRefContent(content)

{

        System.Windows.Forms.RichTextBox rtBox = new  System.Windows.Forms.RichTextBox();
        rtBox.Rtf =  GetDefaultRtf(content);
        return rtBox.Text;

}

 

RichTextBox控件

与常用的TextBox一样,RichTextBox控件派生于TextBoxBase。所以,它与TextBox共享许多功能,但许多功能是不同的。TextBox常用于从用户处获取短文本字符串,而RichTextBox用于显示和输入格式化的文本(例如,黑体、下划线和斜体)。它使用标准的格式化文本,称为Rich  Text Format (富文本格式)或 RTF。

在上面的示例中,我们使用了标准的TextBox。也可以使用RichTextBox来完成该任务。实际上,如后面的示例所示,可以删除textBoxOutput  文本框,在它的位置上插入一个同名的RichTextBox,这个示例还会像以前那样运行。

RichTextBox控件的属性

如果这种文本框比上一节介绍的文本框更高级,我们就会期望它有一些新属性。表15-11中列出了RichTextBox的一些常用属性。

表  15-11

名    称

描    述

CanRedo

如果上一个被撤销的操作可以使用Redo重复,这个属性就是true

CanUndo

如果可以在RichTextBox上撤销上一个操作,这个属性就是true,注意,CanUndo在TextBoxBase中定义,所以也可以用于TextBox控件

RedoActionName

这个属性包含通过Redo方法执行的操作名称

DetectUrls

把这个属性设置为true,可以使控件检测URL,并格式化它们(在浏览器中是带有下划线的部分)

Rtf

它对应于Text属性,但包含RTF格式的文本

SelectedRtf

使用这个属性可以获取或设置控件中被选中的RTF格式文本。如果把这些文本复制到另一个应用程序中,例如Word,该文本会保留所有的格式化信息

SelectedText

与SelectedRtf一样,可以使用这个属性获取或设置被选中的文本。但与该属性的RTF版本不同,所有的格式化信息都会丢失

SelectionAlignment

它表示选中文本的对齐方式,可以是Center, Left 或  Right

SelectionBullet

使用这个属性可以确定选中的文本是否格式化为项目符号的格式,或使用它插入或删除项目符号

BulletIndent

使用这个属性可以指定项目符号的缩进像素值

SelectionColor

这个属性可以修改选中文本的颜色

SelectionFont

这个属性可以修改选中文本的字体

SelectionLength

使用这个属性可以设置或获取选中文本的长度

SelectionType

这个属性包含了选中文本的信息。它可以确定是选择了一个或多个OLE对象,还是仅选择了文本

ShowSelectionMargin

如果把这个属性设置为true,在RichTextBox  的左边就会出现一个页边距,这将使用户更易于选择文本

UndoActionName

如果用户选择撤销某个动作,该属性将获取该动作的名称

SelectionProtected

把这个属性设置为true,可以指定不修改文本的某些部分

从上面的列表可以看出,大多数新属性都与选中的文本有关。这是因为在用户处理其文本时,对它们应用的任何格式化操作都是对用户选择出来的文本进行的。万一没有选择出文本,格式化操作就从光标所在的位置开始应用,该位置称为插入点。

RichTextBox控件的事件

RichTextBox使用的大多数事件与TextBox使用的事件相同,表15-12中有几个有趣的新事件。

表  15-12

名    称

描    述

LinkedClick

在用户单击文本中的链接时,引发该事件

Protected

在用户尝试修改已经标记为受保护的文本时,引发该事件

(续表)   

名    称

描    述

SelectionChanged

在选中文本发生变化时,引发该事件。如果因某些原因不希望用户修改选中的文本,就可以在该事件中禁止修改

在下面的示例中,将创建一个非常基本的文本编辑器。它说明了如何修改文本的基本格式,如何加载和保存RichTextBox中的文本。为了简单起见,这个示例被加载和保存到固定的文件中。

试试看:RichTextBox示例

与往常一样,首先设计窗体:

(1)  在C:/BegVCSharp/Chapter15目录下创建一个新的C# Windows应用程序,命名为RichTextBoxTest。

(2)  创建窗体,如图15-14所示。文本框textSize应是一个TextBox控件。richTextBoxText文本框应是一个RichTextBox控件。

图  15-14

(3) 如图15-14所示命名控件。

(4)  除了文本框以外,把其他控件的Text属性设置为其控件名称(但表示该控件类型的部分不算)。

(5)  把textBoxSize文本框的Text属性改为10。

(6) 锚定控件,如表15-13所示。

表  15-13

控 件 名 称

Anchor值

buttonLoad 和 buttonSave

Bottom

RichTextBoxText

Top, Left, Bottom, Right

其他控件

Top

(7)  把窗体的MinimumSize属性值设置为Size属性的值。

示例的说明

前面是该示例的可见部分,下面添加代码。双击Bold按钮,在代码中添加Click事件处理程序。下面是该事件的代码:

private void buttonBold_Click(object  sender, EventArgs e)

{

   Font oldFont;

Font newFont;

   // Get the font that is being used in the selected text

   oldFont = this.richTextBoxText.SelectionFont;

   // If the font is using bold style now, we should remove the

   // Formatting

   if (oldFont.Bold)

      newFont = new Font(oldFont, oldFont.Style &  ~FontStyle.Bold);

   else

      newFont = new Font(oldFont, oldFont.Style |  FontStyle.Bold);

   // Insert the new font and return focus to the RichTextBox

   this.richTextBoxText.SelectionFont = newFont;

   this.richTextBoxText.Focus();

}

首先获取当前选中文本使用的字体,并把它赋给一个局部变量。然后检查一下选中文本是否为黑体。如果是,就去除黑体设置;否则就设置黑体。使用oldFont作为原型,创建一个新字体,但根据需要添加或删除黑体格式。

最后,把新字体赋给选中的文本,把焦点返回给RichTextBox。Font对象详见第33章。

buttonItalic 和  buttonUnderline的事件处理程序的代码与上面的代码相同,但检查相关样式的代码不同。双击Italic 和  Underline两个按钮,添加下面的代码:

private void buttonItalic_Click(object  sender, EventArgs e)

{

   Font oldFont;

   Font newFont;

   // Get the font that is being used in the selected text

   oldFont = this.richTextBoxText.SelectionFont;

   // If the font is using Italic style now, we should remove it

   if (oldFont.Italic)

      newFont = new Font(oldFont, oldFont.Style &  ~FontStyle.Italic);

   else

      newFont = new Font(oldFont, oldFont.Style |  FontStyle.Italic);

   // Insert the new font

   this.richTextBoxText.SelectionFont = newFont;

   this.richTextBoxText.Focus();

}

private void buttonUnderline_Click(object sender, System.EventArgs  e)

{

   Font oldFont;

   Font newFont;

   // Get the font that is being used in the selected text

   oldFont = this.richTextBoxText.SelectionFont;

   // If the font is using Underline style now, we should remove  it

   if (oldFont.Underline)

      newFont = new Font(oldFont, oldFont.Style &  ~FontStyle.Underline);

   else

      newFont = new Font(oldFont, oldFont.Style |  FontStyle.Underline);

   // Insert the new font

   this.richTextBoxText.SelectionFont = newFont;

   this.richTextBoxText.Focus();

}

双击最后一个格式化按钮Center,添加下面的代码:

private void buttonCenter_Click(object  sender, System.EventArgs e)

{

   if (this.richTextBoxText.SelectionAlignment ==  HorizontalAlignment.Center)

      this.richTextBoxText.SelectionAlignment =  HorizontalAlignment.Left;

   else

      this.richTextBoxText.SelectionAlignment =  HorizontalAlignment.Center;

   this.richTextBoxText.Focus();

}

这里必须检查一下另一个属性SelectionAlignment,看看选中的文本是否已经居中对齐,因为我们希望按钮像一个开关那样运作。如果文本已居中,就使它左对齐,否则就使它居中。HorizontalAlignment是一个枚举,其值可以是Left、Right、Center、Justify和  NotSet。在本例中,只检查一下是否设置了Center,如果已经设置了,就把对齐方式设置为Left。如果不是,就设置为Center。

文本编辑器能进行的最后一个格式化操作是设置文本的大小。为文本框Size添加两个事件处理程序,一个处理程序控制输入,另一个处理程序检测用户输入完一个值的时间。

在Properties窗口的Events列表中找到并双击textBoxSize  控件的KeyPress和Validated事件,给处理程序添加代码。

与前面示例使用的Validating不同,Validated事件在进行完验证后引发。这两个事件处理程序都使用一个帮助方法ApplyTextSize,该方法带有一个字符串参数,表示文本的大小:

private void textBoxSize_KeyPress(object  sender, KeyPressEventArgs e)

{

   // Remove all characters that are not numbers, backspace and  enter.

   if ((e.KeyChar < 48 || e.KeyChar > 57) &&

                                          e.KeyChar != 8 &&  e.KeyChar != 13)

   {

      e.Handled = true;

   }

   else if (e.KeyChar == 13)

   {

      // Apply size if the user hits enter

      TextBox txt = (TextBox)sender;

      if (txt.Text.Length > 0)

         ApplyTextSize(txt.Text);

      e.Handled = true;

      this.richTextBoxText.Focus();

   }

}

private void textBoxSize_Validated(object sender, CancelEventArgs  e)

{

   TextBox txt = (TextBox)sender;

   ApplyTextSize(txt.Text);

   this.richTextBoxText.Focus();

}

private void ApplyTextSize(string textSize)

{

   // Convert the text to a float because we'll be needing a float  shortly

   float newSize = Convert.ToSingle(textSize);

   FontFamily currentFontFamily;

   Font newFont;

   // Create a new font of the same family but with the new size

   currentFontFamily =  this.richTextBoxText.SelectionFont.FontFamily;

   newFont = new Font(currentFontFamily, newSize);

   // Set the font of the selected text to the new font

   this.richTextBoxText.SelectionFont = newFont;

}

KeyPress事件只允许用户输入一个整数,并在用户按下回车键时,调用ApplyTextSize。我们感兴趣的是帮助方法ApplyTextSize。它首先把文本的大小从字符串转换为浮点数,我们只允许用户输入整数,但在创建新字体时,需要使用浮点数,所以把它转换为正确的数据类型。

之后,获取字体所属的字体系列,从该系列中创建一个带有新字号的新字体。最后,把选中文本的字体设置为新字体。

这就是我们所能进行的所有格式化操作,有一些操作可以由RichTextBox本身处理。如果现在尝试运行这个示例,就可以把文本设置为黑体、斜体和下划线,还可以居中文本。这就是我们期望的操作,但还有一些比较有趣的操作。试着在文本中键入一个网址,例如http://  www.wrox.com,该文本就被控件识别为一个Internet地址,加上下划线,当把鼠标指针移到该文本的上面时,鼠标指针就会变成手的形状。单击该文本,就会打开一个网页。我们需要处理用户单击链接时引发的事件:LinkClicked。

在Properties窗口的Events列表中找到LinkClicked事件,双击它,给事件处理程序中添加代码。我们以前没有见过这个事件处理程序。它用于提供单击链接的文本,处理程序非常简单,如下所示:

private void  richTextBoxText_LinkedClick(object sender,  

                                  System.Windows.Forms.LinkClickedEventArgs e)

{

   System.Diagnostics.Process.Start(e.LinkText);

}

这段代码打开了默认的浏览器(如果浏览器没有打开),并导航到该链接指向的站点。

应用程序的编辑部分就完成了。剩下的是加载和保存控件的内容。这里使用一个固定的文件。双击Load按钮,添加下面的代码:

private void buttonLoad_Click(object  sender, EventArgs e)

{

   // Load the file into the RichTextBox

   try

   {

      richTextBoxText.LoadFile("Test.rtf");

   }

   catch (System.IO.FileNotFoundException)

   {

      MessageBox.Show("No file to load yet");

   }

}

这就完成了,不需要做其他工作。因为我们处理的是文件,所以总是有可能遇到异常,必须处理这些异常。在Load方法中,处理了因文件不存在而抛出的异常。保存文件也是这样,双击Save按钮,添加下面的代码:

private void buttonSave_Click(object  sender, EventArgs e)

{

   // Save the text

   try

   {

      richTextBoxText.SaveFile("Test.rtf");

   }

   catch (System.Exception err)

   {

      MessageBox.Show(err.Message);

   }

}

现在运行示例,格式化一些文本,再单击Save按钮。清空文本框,单击Load按钮,刚才保存的文本就会再次显示出来。


你可能感兴趣的:(可用RichTextBox控件读取rtf)