设置RichTextBox空间中字体为粗体,斜体和增加下划线的功能代码[转自JunHerry的博客,感谢原作者]
2010-02-27 01:28
459 查看
做一个文本编辑控件,设置字体的格式等功能必不可少。RichTextBox作为.Net提供的富文本控件,成为很多人做文本编辑器的首选。本文将要讨论就是针对RichTextBox控件的设置粗体、斜体、下划线等功能的相关问题。
首先我们看一段设置粗体的代码。
乍一看上面的代码没什么问题,首先获取被选中文本的Font对象,然后判断是否为粗体,如果是,就将粗体取消;如果不是,则将被选中文本设为粗体。写几个字母并选中,点击 B 按钮,文字加粗;再点击,文字去粗。好像真的没什么问题。那如果我选中的字体中既有汉字又有英文,或者字体的FontName不同时,会有问题吗?试一下,结果出异常了。
为什么呢?因为我们选中的文本格式不同一,它们的Font不一样,当它们被选中时,我们获得的SelectionFont就是null了,因此这里会出现空指针异常。该怎么办呢?我们可以在使用前先判断一下oldFont是否为空。如果为空,我们再做单独处理。
在被选中文本的SelectionFont为空的情况下,我们该怎样设置被选中文本的格式是一个很重要的问题。虽然整体的SelectionFont为空,但是,如果我们化整为零,只选中一个文字,那么它的Font肯定不为空,而设置它的FontStyle也 就很简单了。因此,我们得出这样的策略。
1. 如果只选中一个文字或者光标没有选中文字而只是处于文本框的某一坐标点,这时SelectionFont不为空,可直接加粗或去粗。
2. 如果选中了多个文字并且SelectionFont为空,可以做如下处理,首先获取被选中文本的ProtoType,即保留被选文字的副本,对其副本进行操作而不影响它的原型。逐一选中副本中的文字,并一一设置它们的FontStyle。
3. 如果选中了多个文字但是它的SelectionFont不为空,即它们的字体种类相同,能不能直接像第一种情况那样加粗去粗呢?不能,因为它们的FontSize和FontStyle可能不相同。这时我们也需要一一处理,因此,情况3类似于情况2的处理方法。
以上是针对Bold的讨论,同样也适用于Italic和Underline,因此,我们可以写一个统一的设置FontStyle的方法,方法如下所示。
这样就避免了设置字体格式时的上述问题。
首先我们看一段设置粗体的代码。
//设置粗体 private void toolStripButton4_Click(object sender, EventArgs e) { Font oldFont, newFont; oldFont = curRichTextBox.SelectionFont; if (oldFont.Bold) { newFont = new Font(oldFont, oldFont.Style ^ FontStyle.Bold); } else { newFont = new Font(oldFont, oldFont.Style | FontStyle.Bold); } curRichTextBox.SelectionFont = newFont; curRichTextBox.Focus(); }
乍一看上面的代码没什么问题,首先获取被选中文本的Font对象,然后判断是否为粗体,如果是,就将粗体取消;如果不是,则将被选中文本设为粗体。写几个字母并选中,点击 B 按钮,文字加粗;再点击,文字去粗。好像真的没什么问题。那如果我选中的字体中既有汉字又有英文,或者字体的FontName不同时,会有问题吗?试一下,结果出异常了。
为什么呢?因为我们选中的文本格式不同一,它们的Font不一样,当它们被选中时,我们获得的SelectionFont就是null了,因此这里会出现空指针异常。该怎么办呢?我们可以在使用前先判断一下oldFont是否为空。如果为空,我们再做单独处理。
在被选中文本的SelectionFont为空的情况下,我们该怎样设置被选中文本的格式是一个很重要的问题。虽然整体的SelectionFont为空,但是,如果我们化整为零,只选中一个文字,那么它的Font肯定不为空,而设置它的FontStyle也 就很简单了。因此,我们得出这样的策略。
1. 如果只选中一个文字或者光标没有选中文字而只是处于文本框的某一坐标点,这时SelectionFont不为空,可直接加粗或去粗。
2. 如果选中了多个文字并且SelectionFont为空,可以做如下处理,首先获取被选中文本的ProtoType,即保留被选文字的副本,对其副本进行操作而不影响它的原型。逐一选中副本中的文字,并一一设置它们的FontStyle。
3. 如果选中了多个文字但是它的SelectionFont不为空,即它们的字体种类相同,能不能直接像第一种情况那样加粗去粗呢?不能,因为它们的FontSize和FontStyle可能不相同。这时我们也需要一一处理,因此,情况3类似于情况2的处理方法。
以上是针对Bold的讨论,同样也适用于Italic和Underline,因此,我们可以写一个统一的设置FontStyle的方法,方法如下所示。
///<summary> ///设置字体格式:粗体、斜体、下划线 ///</summary> /// <param name="style">事件触发后传参:字体格式类型</param> private void ChangeFontStyle(FontStyle style) { if (style != FontStyle.Bold && style != FontStyle.Italic && style != FontStyle.Underline) throw new System.InvalidProgramException("字体格式错误"); RichTextBox tempRichTextBox = new RichTextBox(); //将要存放被选中文本的副本 int curRtbStart = curRichTextBox.SelectionStart; int len = curRichTextBox.SelectionLength; int tempRtbStart = 0; Font font = curRichTextBox.SelectionFont; if (len <= 1 && font != null) //与上边的那段代码类似,功能相同 { if (style == FontStyle.Bold && font.Bold || style == FontStyle.Italic && font.Italic || style == FontStyle.Underline && font.Underline) { curRichTextBox.SelectionFont = new Font(font, font.Style ^ style); } else if (style == FontStyle.Bold && !font.Bold || style == FontStyle.Italic && !font.Italic || style == FontStyle.Underline && !font.Underline) { curRichTextBox.SelectionFont = new Font(font, font.Style | style); } return; } tempRichTextBox.Rtf = curRichTextBox.SelectedRtf; tempRichTextBox.Select(len - 1, 1); //选中副本中的最后一个文字 //克隆被选中的文字Font,这个tempFont主要是用来判断 //最终被选中的文字是否要加粗、去粗、斜体、去斜、下划线、去下划线 Font tempFont = (Font)tempRichTextBox.SelectionFont.Clone(); //清空2和3 for (int i = 0; i < len; i++) { tempRichTextBox.Select(tempRtbStart + i, 1); //每次选中一个,逐个进行加粗或去粗 if (style == FontStyle.Bold && tempFont.Bold || style == FontStyle.Italic && tempFont.Italic || style == FontStyle.Underline && tempFont.Underline) { tempRichTextBox.SelectionFont = new Font(tempRichTextBox.SelectionFont, tempRichTextBox.SelectionFont.Style ^ style); } else if (style == FontStyle.Bold && !tempFont.Bold || style == FontStyle.Italic && !tempFont.Italic || style == FontStyle.Underline && !tempFont.Underline) { tempRichTextBox.SelectionFont = new Font(tempRichTextBox.SelectionFont, tempRichTextBox.SelectionFont.Style | style); } } tempRichTextBox.Select(tempRtbStart, len); curRichTextBox.SelectedRtf = tempRichTextBox.SelectedRtf; //将设置格式后的副本拷贝给原型 curRichTextBox.Select(curRtbStart, len); }
这样就避免了设置字体格式时的上述问题。
相关文章推荐
- c#.net 文本编辑控件——设置RichTextBox的字体格式:粗体、斜体、下划线
- [C#]设置RichTextBox的字体格式:粗体、斜体、下划线 【转】
- android在xml的textStyle中,设置一个字体是粗体或斜体或带有下划线
- C#RichTextBox设置FontStyle(粗体,斜体,下划线,删除线)
- HTML常用字体样式设置(加粗、下划线、斜体)
- html字体大小、颜色、粗体、下划线代码(局部)
- Latex设置字体大小,加粗,加下划线,变斜体_孩纸气_新浪博客
- java字体设置,包括大小,颜色,加粗,下划线,对齐,斜体的设置
- [原] 用 javascript 给你的博客增加运行代码功能
- 菜单事件的响应(RichTextBox字体加粗、斜体、下划线)
- html字体大小、颜色、粗体、下划线代码(局部)
- 设置字体同时为粗体、斜体
- 增加spyder模块代码提示功能和spyder 代码自动补齐设置方式
- Ios 自定义字体设置粗体、斜体
- java字体设置,包括大小,颜色,加粗,下划线,对齐,斜体的设置
- java字体设置,包括大小,颜色,加粗,下划线,对齐,斜体的设置
- ViewPager实现自动翻页功能 --转载出处找不到了,根据自己的理解写个随笔方便以后的记忆以及代码的共享,感谢给我启发的那位高手--第一次写博客哈
- POI导出Excel代码实例(设置字体,边框,合并单元格,其它功能以后探索到继续更新)
- java字体设置,包括大小,颜色,加粗,下划线,对齐,斜体的设置
- eclipse中设置java、xml文件的字体大小以及代码自动提示功能