[C#]设置RichTextBox的字体格式:粗体、斜体、下划线 【转】

本文主要是介绍[C#]设置RichTextBox的字体格式:粗体、斜体、下划线 【转】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

    //设置粗体  
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对象,然后判断是否为粗体,如果是,就将粗体取消;如果不是,则将被选中文本设为粗体。写几个字母并选中,点击 按钮,文字加粗;再点击,文字去粗。好像真的没什么问题。那如果我选中的字体中既有汉字又有英文,或者字体的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#]设置RichTextBox的字体格式:粗体、斜体、下划线 【转】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/690063

相关文章

PostgreSQL 默认隔离级别的设置

《PostgreSQL默认隔离级别的设置》PostgreSQL的默认事务隔离级别是读已提交,这是其事务处理系统的基础行为模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一 默认隔离级别概述1.1 默认设置1.2 各版本一致性二 读已提交的特性2.1 行为特征2.2

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

mtu设置多少网速最快? 路由器MTU设置最佳网速的技巧

《mtu设置多少网速最快?路由器MTU设置最佳网速的技巧》mtu设置多少网速最快?想要通过设置路由器mtu获得最佳网速,该怎么设置呢?下面我们就来看看路由器MTU设置最佳网速的技巧... 答:1500 MTU值指的是在网络传输中数据包的最大值,合理的设置MTU 值可以让网络更快!mtu设置可以优化不同的网

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

CSS3中的字体及相关属性详解

《CSS3中的字体及相关属性详解》:本文主要介绍了CSS3中的字体及相关属性,详细内容请阅读本文,希望能对你有所帮助... 字体网页字体的三个来源:用户机器上安装的字体,放心使用。保存在第三方网站上的字体,例如Typekit和Google,可以link标签链接到你的页面上。保存在你自己Web服务器上的字

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.