Asp.Net教程,WinForm教程,Asp.Net MVC,vs2008教程,vs2010教程,Silverlight技术,源码下载,Asp.Net视频教程
全站热门标签
vs2010 Silverlight 存储过程 水晶报表 ADO.NET JavaScript LINQ AjaxPro DataGridView 面向对象 Extjs GridView XML DevExpress HTML教程 Oracle jQuery 分页 GDI+ Visual C++2010 MySQL Office2010 WPF MVC Dojo WCF4.0 VB.NET Sql2005 textbox cookie WCF WinForm Discuz!NT SQL经典语句 T-SQL checkbox ASPxGridView F# asp.net SQL VS2008新特性 DropDownList Access TreeView Ajax VS2008 页面执行时间 Flex 字符串 回调 VB2005 DataSet C#时间 ASP.NET性能优化 用户在线检测 动画
FrameworkC#技术 VB.NET VC.NET WCF WPF
当前位置: 主页 > WinForm教程 > C#技术 >

C#文本编辑控件—设置RichTextBox的字体格式:粗体、斜体、下划线

时间:2010-05-13 19:27来源:未知 作者:admin 点击:

做一个文本编辑控件,设置字体的格式等功能必不可少。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);   

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

 

(责任编辑:admin)
Tags:RichTextBox 文本编辑器
责任编辑:admin
返回顶部
------分隔线----------------------------
推荐内容
骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价 骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价