[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);  

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



本文转自静默虚空博客园博客,原文链接:http://www.cnblogs.com/jingmoxukong/articles/2118114.html,如需转载请自行联系原作者


相关文章
|
7月前
|
C#
C# DEV 关于设置gridview 指定单元格字体为红色
C# DEV 关于设置gridview 指定单元格字体为红色
|
7月前
|
C#
C# DEV TextEdit 设置文本框只能输入数字(整数)
C# DEV TextEdit 设置文本框只能输入数字(整数)
|
7月前
|
数据采集 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPISDK设置软件触发模式(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPISDK设置软件触发模式(C#)
80 1
|
7月前
|
存储 监控 开发工具
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现相机图像转换为AVI视频格式(C#)
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现相机图像转换为AVI视频格式(C#)
71 0
|
2月前
|
XML JSON 前端开发
C#使用HttpClient四种请求数据格式:json、表单数据、文件上传、xml格式
C#使用HttpClient四种请求数据格式:json、表单数据、文件上传、xml格式
494 0
|
3月前
|
关系型数据库 数据库 PostgreSQL
在C#中获取与设置Windows的字符编码方式
通过以上步骤,你可以在Docker环境下有效地重启PostgreSQL服务。这对于维护数据库健康、应用更新或环境配置更改后确保数据库服务正常运行至关重要。根据你的具体需求和环境设置,选择合适的方法来执行重启操作。
21 0
|
7月前
|
设计模式 C#
36.c#:如何设置MDL窗口
36.c#:如何设置MDL窗口
56 1
|
7月前
|
JSON C# 数据格式
C# 处理gzip格式的json
C# 处理gzip格式的json
88 0
|
7月前
|
存储 传感器 监控
工业相机如何实现实时和本地Raw格式图像和Bitmap格式图像的保存和相互转换(C#代码,UI界面版)
工业相机如何实现实时和本地Raw格式图像和Bitmap格式图像的保存和相互转换(C#代码,UI界面版)
255 0
|
1月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
34 3