[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

相关文章

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

easyui同时验证账户格式和ajax是否存在

accountName: {validator: function (value, param) {if (!/^[a-zA-Z][a-zA-Z0-9_]{3,15}$/i.test(value)) {$.fn.validatebox.defaults.rules.accountName.message = '账户名称不合法(字母开头,允许4-16字节,允许字母数字下划线)';return fal

uniapp设置微信小程序的交互反馈

链接:uni.showToast(OBJECT) | uni-app官网 (dcloud.net.cn) 设置操作成功的弹窗: title是我们弹窗提示的文字 showToast是我们在加载的时候进入就会弹出的提示。 2.设置失败的提示窗口和标签 icon:'error'是设置我们失败的logo 设置的文字上限是7个文字,如果需要设置的提示文字过长就需要设置icon并给

C# dateTimePicker 显示年月日,时分秒

dateTimePicker默认只显示日期,如果需要显示年月日,时分秒,只需要以下两步: 1.dateTimePicker1.Format = DateTimePickerFormat.Time 2.dateTimePicker1.CustomFormat = yyyy-MM-dd HH:mm:ss Tips:  a. dateTimePicker1.ShowUpDown = t

C#关闭指定时间段的Excel进程的方法

private DateTime beforeTime;            //Excel启动之前时间          private DateTime afterTime;               //Excel启动之后时间          //举例          beforeTime = DateTime.Now;          Excel.Applicat

C# 防止按钮botton重复“点击”的方法

在使用C#的按钮控件的时候,经常我们想如果出现了多次点击的时候只让其在执行的时候只响应一次。这个时候很多人可能会想到使用Enable=false, 但是实际情况是还是会被多次触发,因为C#采用的是消息队列机制,这个时候我们只需要在Enable = true 之前加一句 Application.DoEvents();就能达到防止重复点击的问题。 private void btnGenerateSh

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };