设置RichTextBox空间中字体为粗体,斜体和增加下划线的功能代码[转自JunHerry的博客,感谢原作者]

时间:2021-03-07 00:54:38

做一个文本编辑控件,设置字体的格式等功能必不可少。RichTextBox作为.Net提供的富文本控件,成为很多人做文本编辑器的首选。本文将要讨论就是针对RichTextBox控件的设置粗体、斜体、下划线等功能的相关问题。

首先我们看一段设置粗体的代码。

 

 

乍一看上面的代码没什么问题,首先获取被选中文本的Font对象,然后判断是否为粗体,如果是,就将粗体取消;如果不是,则将被选中文本设为粗体。写几个字母并选中,点击 B 按钮,文字加粗;再点击,文字去粗。好像真的没什么问题。那如果我选中的字体中既有汉字又有英文,或者字体的FontName不同时,会有问题吗?试一下,结果出异常了。

设置RichTextBox空间中字体为粗体,斜体和增加下划线的功能代码[转自JunHerry的博客,感谢原作者]

为什么呢?因为我们选中的文本格式不同一,它们的Font不一样,当它们被选中时,我们获得的SelectionFont就是null了,因此这里会出现空指针异常。该怎么办呢?我们可以在使用前先判断一下oldFont是否为空。如果为空,我们再做单独处理。

在被选中文本的SelectionFont为空的情况下,我们该怎样设置被选中文本的格式是一个很重要的问题。虽然整体的SelectionFont为空,但是,如果我们化整为零,只选中一个文字,那么它的Font肯定不为空,而设置它的FontStyle也 就很简单了。因此,我们得出这样的策略。

1. 如果只选中一个文字或者光标没有选中文字而只是处于文本框的某一坐标点,这时SelectionFont不为空,可直接加粗或去粗。

2. 如果选中了多个文字并且SelectionFont为空,可以做如下处理,首先获取被选中文本的ProtoType,即保留被选文字的副本,对其副本进行操作而不影响它的原型。逐一选中副本中的文字,并一一设置它们的FontStyle。

3. 如果选中了多个文字但是它的SelectionFont不为空,即它们的字体种类相同,能不能直接像第一种情况那样加粗去粗呢?不能,因为它们的FontSize和FontStyle可能不相同。这时我们也需要一一处理,因此,情况3类似于情况2的处理方法。

以上是针对Bold的讨论,同样也适用于Italic和Underline,因此,我们可以写一个统一的设置FontStyle的方法,方法如下所示。

 

这样就避免了设置字体格式时的上述问题。